/*
 *
 *    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/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_BOOL_1_1\n");
        printf("Test_TC_BOOL_2_1\n");
        printf("Test_TC_ACT_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_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_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_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_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_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_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_RH_1_1\n");
        printf("Test_TC_RH_2_1\n");
        printf("Test_TC_SC_4_2\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_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_2\n");
        printf("Test_TC_ULABEL_2_3\n");
        printf("Test_TC_ULABEL_2_4\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_2_1\n");
        printf("Test_TC_DGSW_2_2\n");
        printf("Test_TC_DGSW_2_3\n");
        printf("TestSubscribe_OnOff\n");
        printf("DL_UsersAndCredentials\n");
        printf("DL_LockUnlock\n");
        printf("DL_Schedules\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");

        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_1_1\n");
        printf("Test_TC_G_2_1\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_OPCREDS_1_2\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_1_1\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_1_1\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_2_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_1\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_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_DGSW_1_1\n");
        printf("Test_TC_DGSW_3_1\n");
        printf("Test_TC_DGSW_3_2\n");
        printf("Test_TC_DGWIFI_1_1\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_OCC_3_2\n");
        printf("Test_TC_PRS_2_2\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_1_1\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_1_1\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_1_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_1_2\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_1_2\n");
        printf("Test_TC_LUNIT_2_1\n");
        printf("Test_TC_LUNIT_3_1\n");
        printf("Test_TC_FLABEL_1_1\n");
        printf("Test_TC_FLABEL_2_1\n");
        printf("Test_TC_FLABEL_3_1\n");
        printf("Test_TC_BIND_1_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_1_1\n");
        printf("Test_TC_ACL_2_1\n");
        printf("Test_TC_ACL_2_2\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_2_1\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");

        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_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));
            }
            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));
            }
            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_CC_1_1Suite : public TestCommand
{
public:
    Test_TC_CC_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_1_1", 42, 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(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 31UL));
            }
            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, 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 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, 2UL));
            }
            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, 3UL));
            }
            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));
            }
            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, 5UL));
            }
            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, 6UL));
            }
            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, 7UL));
            }
            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, 16384UL));
            }
            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, 16386UL));
            }
            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, 16387UL));
            }
            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, 16388UL));
            }
            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, 16389UL));
            }
            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, 16390UL));
            }
            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, 16395UL));
            }
            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, 16396UL));
            }
            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, 16397UL));
            }
            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, 16400UL));
            }
            break;
        case 22:
            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 23:
            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 24:
            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 25:
            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 26:
            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 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, 5UL));
            }
            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, 6UL));
            }
            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, 7UL));
            }
            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, 8UL));
            }
            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, 9UL));
            }
            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, 10UL));
            }
            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, 64UL));
            }
            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, 65UL));
            }
            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, 66UL));
            }
            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, 67UL));
            }
            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, 68UL));
            }
            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, 71UL));
            }
            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, 75UL));
            }
            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, 76UL));
            }
            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)));
                {
                    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)"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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 13: {
            LogStep(13, "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 14: {
            LogStep(14, "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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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 18: {
            LogStep(18, "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 19: {
            LogStep(19, "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 20: {
            LogStep(20, "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 21: {
            LogStep(21, "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 22: {
            LogStep(22, "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 23: {
            LogStep(23, "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 24: {
            LogStep(24, "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 25: {
            LogStep(25, "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 26: {
            LogStep(26, "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 27: {
            LogStep(27, "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 28: {
            LogStep(28, "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 29: {
            LogStep(29, "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 30: {
            LogStep(30, "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 31: {
            LogStep(31, "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 32: {
            LogStep(32, "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 33: {
            LogStep(33, "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 34: {
            LogStep(34, "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 35: {
            LogStep(35, "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 36: {
            LogStep(36, "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 37: {
            LogStep(37, "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 38: {
            LogStep(38, "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 39: {
            LogStep(39, "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 40: {
            LogStep(40, "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 41: {
            LogStep(41, "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));
            {
                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::ColorTemperature::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, "TH 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;

    uint8_t CurrentHueValueStep2f;
    uint8_t CurrentHueValueStep3f;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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, 245U));
                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, 35U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 55U));
            }
            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));
                CurrentHueValueStep2f = value;
            }
            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("currentHue", value, CurrentHueValueStep2f));
            }
            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, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 20U));
            }
            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, 180U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 240U));
            }
            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, 180U));
                CurrentHueValueStep3f = value;
            }
            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("currentHue", value, CurrentHueValueStep3f));
            }
            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, 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(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::ColorMode::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, 215U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 245U));
            }
            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, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10U));
            }
            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("currentHue", value, 5U));
            }
            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, 245U));
                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(CheckValue("currentHue", value, 245U));
            }
            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, 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(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::ColorMode::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, 110U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 120U));
            }
            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(CheckValue("currentSaturation", value, 120U));
            }
            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, 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(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::ColorMode::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;

    uint8_t CurrentSaturationValueStep4e;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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, 235U));
                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(CheckValue("currentSaturation", 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, 60U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 80U));
            }
            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, 5U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 35U));
            }
            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));
                CurrentSaturationValueStep4e = value;
            }
            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(CheckValue("currentSaturation", value, CurrentSaturationValueStep4e));
            }
            break;
        case 30:
            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, 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(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=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      = 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::ColorMode::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, 210U));
                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, 230U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 240U));
            }
            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("currentSaturation", value, 240U));
            }
            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("currentSaturation", 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, 10U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15U));
            }
            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("currentSaturation", value, 10U));
            }
            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(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(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::ColorMode::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", 20, 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(CheckValue("currentHue", value, 200U));
                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));
            shouldContinue = true;
            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, 175U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 185U));
            }
            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, 60U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 70U));
            }
            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, 160U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 170U));
            }
            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, 70U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 80U));
            }
            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("currentHue", value, 160U));
            }
            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("currentSaturation", value, 80U));
            }
            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, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 2U));
            }
            break;
        case 17:
            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, 3U));
            }
            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("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.F01 && 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.F01 && 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 sends MoveToHueAndSaturation command to DUT with Hue=160, Saturation=80 and TransitionTime=200 (20s)");
            VerifyOrDo(!ShouldSkip("CC.S.F01 && 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 7: {
            LogStep(7, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 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, "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 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 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 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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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::ColorMode::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "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 19: {
            LogStep(19, "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", 58, 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(CheckValue("currentX", value, 32768U));
            }
            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("currentY", value, 19660U));
            }
            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, 13107U));
                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, 13107U));
                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(CheckValue("currentX", value, 13107U));
            }
            break;
        case 16:
            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 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));
            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("currentX", value, 32768U));
            }
            break;
        case 22:
            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 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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 32768U));
            }
            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("currentY", value, 19660U));
            }
            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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 32768U));
            }
            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("currentY", value, 19660U));
            }
            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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 26214U));
            }
            break;
        case 35:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentY", value, 32768U));
            }
            break;
        case 36:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 37:
            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 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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("currentX", value, 32768U));
            }
            break;
        case 42:
            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 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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(CheckValue("currentX", value, 13107U));
            }
            break;
        case 47:
            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 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 13107U));
            }
            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("currentY", value, 13107U));
            }
            break;
        case 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentX", value, 26214U));
            }
            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("currentY", value, 32768U));
            }
            break;
        case 56:
            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, 2U));
            }
            break;
        case 57:
            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, 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 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 20: {
            LogStep(20, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "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 22: {
            LogStep(22, "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 23: {
            LogStep(23, "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 24: {
            LogStep(24,
                    "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 25: {
            LogStep(25, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 26: {
            LogStep(26, "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 27: {
            LogStep(27, "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 28: {
            LogStep(28,
                    "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 29: {
            LogStep(29, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 30: {
            LogStep(30, "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 31: {
            LogStep(31, "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 32: {
            LogStep(32,
                    "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 33: {
            LogStep(33, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34, "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 35: {
            LogStep(35, "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 36: {
            LogStep(36, "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 37: {
            LogStep(37, "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 38: {
            LogStep(38, "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 39: {
            LogStep(39,
                    "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 40: {
            LogStep(40, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41, "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 42: {
            LogStep(42, "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 43: {
            LogStep(43, "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 44: {
            LogStep(44,
                    "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 45: {
            LogStep(45, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 46: {
            LogStep(46, "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 47: {
            LogStep(47, "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 48: {
            LogStep(48,
                    "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 49: {
            LogStep(49, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 50: {
            LogStep(50, "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 51: {
            LogStep(51, "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 52: {
            LogStep(52,
                    "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 53: {
            LogStep(53, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 54: {
            LogStep(54, "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 55: {
            LogStep(55, "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 56: {
            LogStep(56, "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 57: {
            LogStep(57, "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::ColorMode::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, 31500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32500U));
            }
            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, 26500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 27500U));
            }
            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, 30500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 31500U));
            }
            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, 27500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 28500U));
            }
            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, 29500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 30500U));
                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, 28500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 29500U));
                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, 29500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 30500U));
            }
            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, 28500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 29500U));
            }
            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, 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(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.F00 && 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.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::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, 13000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 14000U));
            }
            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, 14000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15000U));
            }
            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(CheckValue("currentX", value, 13000U));
            }
            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("currentY", value, 14000U));
            }
            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, 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(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 = -2000, 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.F00 && 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.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::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, 280U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 300U));
            }
            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, 260U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 280U));
            }
            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, 250U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 260U));
            }
            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(CheckValue("colorTemperature", value, 250U));
            }
            break;
        case 17:
            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, 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(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::ColorTemperature::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::ColorTemperature::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::ColorTemperature::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::ColorTemperature::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::ColorTemperature::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::ColorMode::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", 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_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));
            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));
            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, "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::ColorTemperature::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 && 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,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x01 (up), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/40");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp && 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 8: {
            LogStep(8, "After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 9: {
            LogStep(9, "After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 10: {
            LogStep(10, "After another 5 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 11: {
            LogStep(11,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x03(down), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/20");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp && 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 12: {
            LogStep(12, "After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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, "After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 14: {
            LogStep(14, "After another 5 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 15: {
            LogStep(15,
                    "TH sends MoveColorTemperature command to DUT with MoveMode = 0x01(up), Rate = (ColorTempPhysicalMaxMireds - "
                    "ColorTempPhysicalMinMireds)/20");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C4b.Rsp && 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 16: {
            LogStep(16,
                    "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 && 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 17: {
            LogStep(17, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 18: {
            LogStep(18, "After another 2 seconds, TH reads ColorTemperatureMireds attribute from DUT");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 19: {
            LogStep(19, "TH reads ColorMode attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0008 && 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 20: {
            LogStep(20, "TH reads EnhancedColorMode attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A4001 && 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 21: {
            LogStep(21, "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 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_CC_6_3Suite : public TestCommand
{
public:
    Test_TC_CC_6_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CC_6_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_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));
            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));
            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.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::ColorTemperature::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 && 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,
                    "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 && 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 8: {
            LogStep(8, "After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 9: {
            LogStep(9, "After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 10: {
            LogStep(10, "After another 5 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 11: {
            LogStep(11,
                    "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 && 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 12: {
            LogStep(12, "After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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, "After 10 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 14: {
            LogStep(14, "After another 5 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 15: {
            LogStep(15, "TH reads ColorMode attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0008 && 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 16: {
            LogStep(16, "TH reads EnhancedColorMode attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A4001 && 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 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_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, 22500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 27500U));
            }
            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, 27500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32500U));
            }
            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, 34000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 36500U));
            }
            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, 34500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 36500U));
            }
            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, 17500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 22500U));
            }
            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, 12500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 17500U));
            }
            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, 7500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12500U));
            }
            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, 7500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12500U));
            }
            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, 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(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.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::ColorMode::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, 7000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9000U));
            }
            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, 9000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11000U));
            }
            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, 11000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12000U));
            }
            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(CheckValue("enhancedCurrentHue", value, 12000U));
            }
            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, 9000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11000U));
            }
            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, 7000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9000U));
            }
            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, 6000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7000U));
            }
            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(CheckValue("enhancedCurrentHue", value, 6000U));
            }
            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, 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(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.F00 && 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.F00 && CC.S.A4001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::ColorMode::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(CheckValue("enhancedCurrentHue", value, 20000U));
            }
            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("currentSaturation", value, 50U));
            }
            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, 17000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 19000U));
            }
            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, 56U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 74U));
            }
            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, 16000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 17000U));
            }
            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, 80U));
            }
            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(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(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.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::ColorMode::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", 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_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;

    uint8_t CurrentSaturationValue;
    uint16_t ColorTempPhysicalMinMireds;
    uint16_t ColorTempPhysicalMaxMireds;
    uint16_t EnhancedCurrentHueValue;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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, 235U));
                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, 240U));
                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));
                CurrentSaturationValue = 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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, CurrentSaturationValue));
                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));
            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));
            shouldContinue = true;
            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));
            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));
            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, 23500U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 26500U));
                EnhancedCurrentHueValue = 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), 0));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, EnhancedCurrentHueValue));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 26500U));
            }
            break;
        case 34:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 35:
            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.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.C01.Rsp && CC.S.F00"), 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 && CC.S.F00"), 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 && CC.S.F00"), 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 && CC.S.F00"), 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.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 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.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 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 && CC.S.F00"), 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.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 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.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, "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 20: {
            LogStep(20, "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 21: {
            LogStep(21,
                    "TH sends MoveToColorTemperature command to DUT with ColorTemperatureMireds= ColorTempPhysicalMaxMireds / 2 "
                    "and TransitionTime=0 (immediately).");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp && 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 22: {
            LogStep(
                22,
                "TH sends MoveColorTemperature command to DUT with MoveMode = 0x01 (up), Rate = ColorTempPhysicalMaxMireds / 40");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C0a.Rsp && 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 23: {
            LogStep(23, "After 10 seconds, TH sends StopMoveStep command to DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.C47.Rsp && 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 24: {
            LogStep(24, "TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 25: {
            LogStep(25, "After another 2 seconds, TH reads ColorTemperatureMireds attribute from DUT.");
            VerifyOrDo(!ShouldSkip("CC.S.F04 && CC.S.A0007 && 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 26: {
            LogStep(26,
                    "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 27: {
            LogStep(27, "Wait 100ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 100UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28, "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 29: {
            LogStep(29, "Wait 10s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 30: {
            LogStep(30, "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 31: {
            LogStep(31, "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 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.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 34: {
            LogStep(34, "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 35: {
            LogStep(35, "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_BINFO_1_1Suite : public TestCommand
{
public:
    Test_TC_BINFO_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_1Suite : public TestCommand
{
public:
    Test_TC_BINFO_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BINFO_2_1", 69, 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), 0));
            shouldContinue = true;
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_UNSUPPORTED_WRITE));
            break;
        case 68:
            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 && PART_NUM"), 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 && PART_NUM"), 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,
                    "Step 56 is implicitly validating the attribute(CapabilityMinima) constraints, as long as the payload is being "
                    "parsed successfully");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && BINFO.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 67: {
            LogStep(67, "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 68: {
            LogStep(68, "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_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_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", 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_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, 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(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 the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GeneralDiagnostics::Id,
                                 GeneralDiagnostics::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "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", 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_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;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(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);
        }
        }
        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", 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_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));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("featureMap", value, 1UL));
                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, 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));
            }
            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, 64UL));
            }
            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, 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)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("generatedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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(CheckNextListItemDecodes<decltype(value)>("generatedCommandList", iter_0, 0));
                    VerifyOrReturn(CheckValue("generatedCommandList[0]", iter_0.GetValue(), 0UL));
                    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 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");
            VerifyOrDo(!ShouldSkip(" !I.S.F00 "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "TH reads the FeatureMap attribute from the DUT");
            VerifyOrDo(!ShouldSkip("I.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the optional command(TriggerEffect) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("I.C.C40.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional attribute(IdentifyQuery) in AcceptedCommandList");
            VerifyOrDo(!ShouldSkip("I.C.C01.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::AcceptedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read the global attribute: GeneratedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Identify::Id, Identify::Attributes::GeneratedCommandList::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read the optional attribute(IdentifyQueryResponse) in GeneratedCommandList");
            VerifyOrDo(!ShouldSkip("I.S.C00.Tx"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            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", 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_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, 43U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 57U));
            }
            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));
            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));
            {
                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 sends IdentifyQuery command to DUT ");
            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 9: {
            LogStep(9, "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 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, "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_LVL_1_1Suite : public TestCommand
{
public:
    Test_TC_LVL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_1_1", 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_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(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7UL));
            }
            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, 15UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            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));
                VerifyOrReturn(CheckConstraintContains("value", value, 16384UL));
            }
            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));
                VerifyOrReturn(CheckConstraintContains("value", value, 5UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 6UL));
            }
            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, 2UL));
            }
            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, 3UL));
            }
            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, 16UL));
            }
            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, 18UL));
            }
            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::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 20UL));
            }
            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));
                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 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, 8UL));
            }
            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)));
                {
                    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, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id, LevelControl::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the optonal 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 5: {
            LogStep(5, "Read the optonal 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 6: {
            LogStep(6, "Read the optonal 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 7: {
            LogStep(7, "Read the optonal 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 8: {
            LogStep(8, "Read the optonal 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 9: {
            LogStep(9, "Read the optonal 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 10: {
            LogStep(10, "Read the optonal 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 11: {
            LogStep(11, "Read the optonal 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 12: {
            LogStep(12, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), LevelControl::Id,
                                 LevelControl::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read the Feature-dependent(LVL.S.F02) attribute 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 14: {
            LogStep(14, "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(CheckValue("options", value, 0U));
                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", 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_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));
            {
                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));
            {
                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 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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("options", value, 0U));
            }
            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));
            {
                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 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), 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 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 30:
            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 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<uint8_t> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 160U));
            }
            break;
        case 33:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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("options", value, 1U));
            }
            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));
            {
                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 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            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 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            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 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            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 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, 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, "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 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 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, "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 11: {
            LogStep(11,
                    "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 && LVL.S.M.VarRate"), 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 12: {
            LogStep(12, "Wait 10000ms");
            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.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 14: {
            LogStep(14, "Wait 10000ms");
            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.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 16: {
            LogStep(16, "Wait 10000ms");
            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.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 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.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 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 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 22: {
            LogStep(22, "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 23: {
            LogStep(23, "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 24: {
            LogStep(24, "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 25: {
            LogStep(25, "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 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, "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 28: {
            LogStep(28, "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 29: {
            LogStep(29, "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 30: {
            LogStep(30, "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 31: {
            LogStep(31, "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 32: {
            LogStep(32, "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 33: {
            LogStep(33, "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 34: {
            LogStep(34, "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 35: {
            LogStep(35, "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 36: {
            LogStep(36, "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 37: {
            LogStep(37, "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 38: {
            LogStep(38, "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 39: {
            LogStep(39, "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 40: {
            LogStep(40, "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 41: {
            LogStep(41, "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 42: {
            LogStep(42, "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 43: {
            LogStep(43, "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 44: {
            LogStep(44, "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 45: {
            LogStep(45, "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 46: {
            LogStep(46, "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_4_1Suite : public TestCommand
{
public:
    Test_TC_LVL_4_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_4_1", 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_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));
            {
                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 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(CheckConstraintType("value", "int8u", "int8u"));
                CurrentLevelValue = 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), 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 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), 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 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));
            {
                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 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, 127U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 173U));
            }
            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(CheckConstraintMinValue("value", value, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 230U));
            }
            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));
            {
                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 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, "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, "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 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 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, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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 13: {
            LogStep(13, "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 14: {
            LogStep(14, "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 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 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 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 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 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 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 21: {
            LogStep(21, "Wait 13s");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 13000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "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 23: {
            LogStep(23, "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 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_LVL_5_1Suite : public TestCommand
{
public:
    Test_TC_LVL_5_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_5_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_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));
            {
                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));
            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("currentLevel", value));
                VerifyOrReturn(CheckValue("currentLevel.Value()", value.Value(), 50U));
            }
            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));
            {
                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 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, 127U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 173U));
            }
            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, 170U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 200U));
            }
            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(), 200U));
            }
            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));
            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, "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, "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 4: {
            LogStep(4, "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 5: {
            LogStep(5,
                    "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "TH sends a Step command to the DUT with StepMode =0x00 (up), StepSize =150 and TransitionTime =300");
            VerifyOrDo(!ShouldSkip("LVL.S.C02.Rsp && LVL.S.M.VarRate"), 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 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 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 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 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 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 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 17: {
            LogStep(17, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 18: {
            LogStep(18, "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 19: {
            LogStep(19, "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 20: {
            LogStep(20, "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 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_LVL_6_1Suite : public TestCommand
{
public:
    Test_TC_LVL_6_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LVL_6_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_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));
            {
                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));
            {
                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 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), 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 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));
            {
                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 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, "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, "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 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7,
                    "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 8: {
            LogStep(8, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        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, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12,
                    "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 13: {
            LogStep(13, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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 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_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", 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_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(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7UL));
            }
            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));
            }
            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(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, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), KeypadInput::Id, KeypadInput::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "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", 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_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(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, 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::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 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), MediaInput::Id, MediaInput::Attributes::ClusterRevision::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Read the global attribute: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaInput::Id, MediaInput::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "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", 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_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(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, 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, 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, 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, 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, 3UL));
            }
            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, 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, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Channel::Id, Channel::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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", 20, 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(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, 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::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::AttributeId> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            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, 6UL));
            }
            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));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                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)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 4UL));
            }
            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, 5UL));
            }
            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, 6UL));
            }
            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, 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)));
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
                VerifyOrReturn(CheckConstraintContains("value", value, 9UL));
            }
            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, 11UL));
            }
            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, 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, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id, MediaPlayback::Attributes::AttributeList::Id,
                                 true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), MediaPlayback::Id,
                                 MediaPlayback::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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 13: {
            LogStep(13, "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 14: {
            LogStep(14, "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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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 18: {
            LogStep(18, "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 19: {
            LogStep(19, "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", 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_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(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;
        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), 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");
            VerifyOrDo(!ShouldSkip("MEDIAINPUT.S.NU"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), AudioOutput::Id, AudioOutput::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read the global attribute: GeneratedCommandList");
            VerifyOrDo(!ShouldSkip(" !MEDIAINPUT.S.NU "), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            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", 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_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(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, 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::CommandId> 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::CommandId> 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, 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, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AttributeList::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "Read the optional command(LaunchContent) in AcceptedCommandList attribute");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.C.C0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Read the optional command(LaunchURL) in AcceptedCommandList attribute");
            VerifyOrDo(!ShouldSkip("CONTENTLAUNCHER.C.C0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ContentLauncher::Id,
                                 ContentLauncher::Attributes::AcceptedCommandList::Id, true, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "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"), 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"), 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));
            {
                chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", 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, "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");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::Status::Id,
                                 true, chip::NullOptional);
        }
        }
        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));
            {
                chip::app::Clusters::ApplicationBasic::ApplicationStatusEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", 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, "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");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(3), ApplicationBasic::Id, ApplicationBasic::Attributes::Status::Id,
                                 true, chip::NullOptional);
        }
        }
        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 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, "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", 10, 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;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(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

            );
        }
        }
        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", 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_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));
            {
                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));
            {
                float value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("playbackSpeed", value, 1.0f));
            }
            break;
        case 7:
            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 8:
            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 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));
            {
                chip::app::Clusters::MediaPlayback::PlaybackStateEnum value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("currentState", 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::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::Clusters::MediaPlayback::Commands::PlaybackResponse::DecodableType value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("status", value.status, 0U));
            }
            break;
        case 15:
            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 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, "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, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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 13: {
            LogStep(13, "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 14: {
            LogStep(14, "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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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("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<uint16_t> mTimeout;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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, 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 = 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("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<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 = 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("targetvalue1", 0, UINT8_MAX, &mTargetvalue1);
        AddArgument("targetvalue2", 0, UINT8_MAX, &mTargetvalue2);
        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> mTargetvalue1;
    chip::Optional<uint8_t> mTargetvalue2;
    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, mTargetvalue1.HasValue() ? mTargetvalue1.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 = mTargetvalue1.HasValue() ? mTargetvalue1.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, 273U));
            }
            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, 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, 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, "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 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", 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_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(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15UL));
            }
            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, 5UL));
            }
            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, 14UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
                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, 26UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 28UL));
            }
            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, 19UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
            }
            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)>("acceptedCommandList", iter_0, 0));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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)>("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, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), PowerSource::Id, PowerSource::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "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, 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, 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, "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 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_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_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_SC_4_2Suite : public TestCommand
{
public:
    Test_TC_SC_4_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_SC_4_2", 47, credsIssuerConfig)
    {
        AddArgument("nodeId", 0, UINT64_MAX, &mNodeId);
        AddArgument("cluster", &mCluster);
        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);
    }

    ~Test_TC_SC_4_2Suite()
    {
        if (deviceInstanceNameBeforeReboot1Buffer != nullptr)
        {
            chip::Platform::MemoryFree(deviceInstanceNameBeforeReboot1Buffer);
            deviceInstanceNameBeforeReboot1Buffer = 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> mDiscriminator;
    chip::Optional<uint16_t> mVendorId;
    chip::Optional<uint16_t> mProductId;
    chip::Optional<uint16_t> mDeviceType;
    chip::Optional<uint16_t> mTimeout;

    char * deviceInstanceNameBeforeReboot1Buffer = nullptr;
    chip::CharSpan deviceInstanceNameBeforeReboot1;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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::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 (deviceInstanceNameBeforeReboot1Buffer != nullptr)
                {
                    chip::Platform::MemoryFree(deviceInstanceNameBeforeReboot1Buffer);
                }
                deviceInstanceNameBeforeReboot1Buffer = static_cast<char *>(chip::Platform::MemoryAlloc(value.instanceName.size()));
                memcpy(deviceInstanceNameBeforeReboot1Buffer, value.instanceName.data(), value.instanceName.size());
                deviceInstanceNameBeforeReboot1 = chip::CharSpan(deviceInstanceNameBeforeReboot1Buffer, value.instanceName.size());
            }
            shouldContinue = true;
            break;
        case 3:
            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.hostName", value.hostName, 12));
                VerifyOrReturn(CheckConstraintMaxLength("value.hostName", value.hostName, 12));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.hostName", value.hostName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.hostName", value.hostName, true));
            }
            shouldContinue = true;
            break;
        case 4:
            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.hostName", value.hostName, 16));
                VerifyOrReturn(CheckConstraintMaxLength("value.hostName", value.hostName, 16));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.hostName", value.hostName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.hostName", value.hostName, true));
            }
            shouldContinue = true;
            break;
        case 5:
            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 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)));
            }
            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)));
                VerifyOrReturn(CheckValue("vendorId", value.vendorId, mVendorId.HasValue() ? mVendorId.Value() : 65521U));
            }
            shouldContinue = true;
            break;
        case 11:
            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 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)));
                if (value.mrpRetryIntervalIdle.HasValue())
                {
                    VerifyOrReturn(CheckConstraintMaxValue("value.mrpRetryIntervalIdle.Value()", value.mrpRetryIntervalIdle.Value(),
                                                           3600000UL));
                }
            }
            shouldContinue = true;
            break;
        case 13:
            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 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)));
                VerifyOrReturn(CheckValue("commissioningMode", value.commissioningMode, 1U));
            }
            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)));
                VerifyOrReturn(CheckValue("deviceType", value.deviceType, mDeviceType.HasValue() ? mDeviceType.Value() : 5U));
                VerifyOrReturn(CheckConstraintMaxValue("value.deviceType", value.deviceType, 999U));
            }
            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(CheckConstraintMaxLength("value.deviceName", value.deviceName, 32));
            }
            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(CheckConstraintMaxValue("value.rotatingIdLen", value.rotatingIdLen, 100ULL));
            }
            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(CheckConstraintNotValue("value.pairingHint", value.pairingHint, 0U));
            }
            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(CheckConstraintMaxLength("value.pairingInstruction", value.pairingInstruction, 128));
            }
            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(CheckConstraintMinValue("value.numIPs", value.numIPs, 1U));
            }
            shouldContinue = true;
            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));
            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, deviceInstanceNameBeforeReboot1));
            }
            shouldContinue = true;
            break;
        case 27:
            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.hostName", value.hostName, 12));
                VerifyOrReturn(CheckConstraintMaxLength("value.hostName", value.hostName, 12));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.hostName", value.hostName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.hostName", value.hostName, true));
            }
            shouldContinue = true;
            break;
        case 28:
            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.hostName", value.hostName, 16));
                VerifyOrReturn(CheckConstraintMaxLength("value.hostName", value.hostName, 16));
                VerifyOrReturn(CheckConstraintIsUpperCase("value.hostName", value.hostName, true));
                VerifyOrReturn(CheckConstraintIsHexString("value.hostName", value.hostName, true));
            }
            shouldContinue = true;
            break;
        case 29:
            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 30:
            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 31:
            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 32:
            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 33:
            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 34:
            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 35:
            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 36:
            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 37:
            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 38:
            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 39:
            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("deviceType", value.deviceType, mDeviceType.HasValue() ? mDeviceType.Value() : 5U));
                VerifyOrReturn(CheckConstraintMaxValue("value.deviceType", value.deviceType, 999U));
            }
            shouldContinue = true;
            break;
        case 40:
            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 41:
            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 42:
            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 43:
            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 44:
            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 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 46:
            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 is put in Commissioning Mode using Open Basic Commissioning Window command and starts advertising "
                    "Commissionable Node Discovery service using DNS-SD");
            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 2: {
            LogStep(2, "Check Instance Name");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 3: {
            LogStep(3, "Check Hostname");
            VerifyOrDo(!ShouldSkip("( MCORE.SC.WIFI || MCORE.SC.ETH ) && !MCORE.SC.THR"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 4: {
            LogStep(4, "Check Hostname");
            VerifyOrDo(!ShouldSkip("( !MCORE.SC.WIFI && !MCORE.SC.ETH ) && MCORE.SC.THR "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "Check Vendor ID (_V)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.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 8: {
            LogStep(8, "Check Device Type ID (_T)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && MCORE.SC.DEVTYPE_SUBTYPE"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByDeviceType::Type value;
            value.value = mDeviceType.HasValue() ? mDeviceType.Value() : 5ULL;
            return FindCommissionableByDeviceType(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, "TXT key for Vendor ID and Product ID (VP)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.VP_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 11: {
            LogStep(11, "TXT key for Vendor ID and Product ID (VP)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.VP_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 12: {
            LogStep(12, "Optional TXT key for MRP Retry Interval Idle (CRI)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.SII_OP_DISCOVERY_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 13: {
            LogStep(13, "Optional TXT key for MRP Retry Interval Active (CRA)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.SAI_OP_DISCOVERY_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 14: {
            LogStep(14, "TXT key for commissioning mode (CM)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "Optional TXT key for device type (DT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && MCORE.SC.DT_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 16: {
            LogStep(16, "Optional TXT key for device name (DN)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.DN_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 17: {
            LogStep(17, "Optional TXT key for rotating device identifier (RI)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.RI_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 pairing hint (PH)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.PH_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 instructions (PI)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.PI_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 20: {
            LogStep(20, "Check IPs");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 21: {
            LogStep(21, "Stop target device");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
            return Stop(kIdentityAlpha, value);
        }
        case 22: {
            LogStep(22, "Start target device with the provided discriminator for basic commissioning advertisement");
            VerifyOrDo(!ShouldSkip("PICS_SDK_CI_ONLY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            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 23: {
            LogStep(23, "TH is rebooted");
            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 TH and enter 'y' after TH startsgarbage: not in length on purpose", 50);
            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, "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);
        }
        case 27: {
            LogStep(27, "Check Hostname");
            VerifyOrDo(!ShouldSkip("( MCORE.SC.WIFI || MCORE.SC.ETH ) && !MCORE.SC.THR "),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 28: {
            LogStep(28, "Check Hostname");
            VerifyOrDo(!ShouldSkip("( !MCORE.SC.WIFI && !MCORE.SC.ETH ) && MCORE.SC.THR"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 29: {
            LogStep(29, "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 30: {
            LogStep(30, "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 31: {
            LogStep(31, "Check Vendor ID (_V)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.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 32: {
            LogStep(32, "Check Device Type ID (_T)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && MCORE.SC.DEVTYPE_SUBTYPE"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByDeviceType::Type value;
            value.value = mDeviceType.HasValue() ? mDeviceType.Value() : 5ULL;
            return FindCommissionableByDeviceType(kIdentityAlpha, value);
        }
        case 33: {
            LogStep(33, "Check Commissioning Mode (_CM)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByCommissioningMode::Type value;
            return FindCommissionableByCommissioningMode(kIdentityAlpha, value);
        }
        case 34: {
            LogStep(34, "TXT key for Vendor ID and Product ID (VP)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.VP_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 35: {
            LogStep(35, "TXT key for Vendor ID and Product ID (VP)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.VP_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 36: {
            LogStep(36, "Optional TXT key for MRP Retry Interval Idle (CRI)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.SII_OP_DISCOVERY_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 37: {
            LogStep(37, "Optional TXT key for MRP Retry Interval Active (CRA)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.SAI_OP_DISCOVERY_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 38: {
            LogStep(38, "TXT key for commissioning mode (CM)");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 39: {
            LogStep(39, "Optional TXT key for device type (DT)");
            VerifyOrDo(!ShouldSkip("PICS_SKIP_SAMPLE_APP && MCORE.SC.DT_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 40: {
            LogStep(40, "Optional TXT key for device name (DN)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.DN_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 41: {
            LogStep(41, "Optional TXT key for rotating device identifier (RI)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.RI_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 42: {
            LogStep(42, "Optional TXT key for pairing hint (PH)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.PH_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 43: {
            LogStep(43, "Optional TXT key for pairing instructions (PI)");
            VerifyOrDo(!ShouldSkip("MCORE.SC.PI_KEY"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 44: {
            LogStep(44, "Check IPs");
            ListFreer listFreer;
            chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionable::Type value;
            return FindCommissionable(kIdentityAlpha, value);
        }
        case 45: {
            LogStep(45, "TH adds an unknown key/value pair in the advertised data");
            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' if TH adds an unknown key/value pair in the advertised datagarbage: not in length on purpose",
                76);
            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, "Scan for DNS-SD commissioner advertisements from TH");
            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);
        }
        }
        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;

    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));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                FeatureMapValue = 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));
            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));
            {
                uint16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("clusterRevision", value, 1U));
            }
            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: FeatureMap");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::FeatureMap::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Check values of flags in this FeatureMap");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && SWTCH.S.F00"), 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, "Check values of flags in this FeatureMap");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && SWTCH.S.F01"), 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, "Check values of flags in this FeatureMap");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && SWTCH.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);
        }
        case 5: {
            LogStep(5, "Check values of flags in this FeatureMap");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && SWTCH.S.F03"), 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, "Check values of flags in this FeatureMap");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && SWTCH.S.F04"), 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 the global attribute: ClusterRevision");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Switch::Id, Switch::Attributes::ClusterRevision::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, -27315));
                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));
            }
            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: 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 2: {
            LogStep(2, "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 3: {
            LogStep(3, "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 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", 16, 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(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 63UL));
            }
            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, 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 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, 18UL));
            }
            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, 17UL));
            }
            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, 2UL));
            }
            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, 20UL));
            }
            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, 19UL));
            }
            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, 17UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 18UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 25UL));
            }
            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, 32UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 33UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 34UL));
            }
            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, 52UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 53UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 54UL));
            }
            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, 55UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 56UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 57UL));
            }
            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, 0UL));
            }
            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));
                VerifyOrReturn(CheckConstraintContains("value", value, 3UL));
            }
            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"));
            }
            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, "Read the global attribute: AttributeList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AttributeList::Id, true,
                                 chip::NullOptional);
        }
        case 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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 13: {
            LogStep(13, "Read the global attribute: AcceptedCommandList");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 14: {
            LogStep(14, "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 15: {
            LogStep(15, "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", 50, 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;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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, -27315));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32767));
            }
            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, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 1U));
            }
            break;
        case 4:
            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 5:
            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 6:
            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 7:
            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 8:
            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 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, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 100U));
            }
            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, 63U));
            }
            break;
        case 11:
            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 12:
            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 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, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            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));
            {
                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 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, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            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));
            {
                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 20:
            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 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, 7U));
            }
            break;
        case 22:
            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 23:
            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 24:
            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 25:
            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 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));
            {
                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 28:
            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 29:
            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 30:
            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 31:
            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 32:
            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 33:
            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 34:
            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 35:
            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 36:
            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 37:
            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 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(CheckConstraintType("value", "int8u", "int8u"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 255U));
            }
            break;
        case 39:
            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 40:
            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 41:
            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 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, 4U));
            }
            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, 65535U));
            }
            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", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            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", "enum8", "enum8"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3U));
            }
            break;
        case 46:
            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 47:
            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 48:
            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 49:
            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, "Reads mandatory attributes from DUT: LocalTemperature");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::LocalTemperature::Id, true,
                                 chip::NullOptional);
        }
        case 2: {
            LogStep(2, "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 3: {
            LogStep(3, "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 4: {
            LogStep(4, "Reads mandatory attributes from DUT: 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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "Reads optional attributes from DUT: 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 7: {
            LogStep(7, "Reads optional attributes from DUT: 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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "Reads optional attributes from DUT: 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 13: {
            LogStep(13, "Reads mandatory attributes from DUT: OccupiedHeatingSetpoint");
            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 14: {
            LogStep(14, "Read UnoccupiedCoolingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, true, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read UnoccupiedHeatingSetpoint attribute from the DUT");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.F02"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, true, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Reads attribute from DUT: 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 17: {
            LogStep(17, "Reads attribute from DUT: 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 18: {
            LogStep(18, "Reads optional attributes from DUT: 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 19: {
            LogStep(19, "Reads optional attributes from DUT: 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 20: {
            LogStep(20, "Reads optional attributes from DUT: MinSetpointDeadBand");
            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 21: {
            LogStep(21, "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 22: {
            LogStep(22, "Reads mandatory attributes from DUT: ControlSequenceOfOperation");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                 Thermostat::Attributes::ControlSequenceOfOperation::Id, true, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Reads mandatory attributes from DUT: SystemMode");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::SystemMode::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "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 25: {
            LogStep(25, "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 26: {
            LogStep(26, "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 27: {
            LogStep(27, "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 28: {
            LogStep(28, "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 29: {
            LogStep(29, "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 30: {
            LogStep(30, "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 31: {
            LogStep(31, "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 32: {
            LogStep(32, "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 33: {
            LogStep(33, "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 34: {
            LogStep(34, "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 35: {
            LogStep(35, "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 36: {
            LogStep(36, "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 37: {
            LogStep(37, "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 38: {
            LogStep(38, "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 39: {
            LogStep(39, "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 40: {
            LogStep(40, "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 41: {
            LogStep(41, "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 42: {
            LogStep(42, "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 43: {
            LogStep(43, "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 44: {
            LogStep(44, "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 45: {
            LogStep(45, "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 46: {
            LogStep(46, "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 47: {
            LogStep(47, "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 48: {
            LogStep(48, "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 49: {
            LogStep(49, "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", 102, 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;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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)));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 2:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 3:
            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 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), 0));
            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));
            break;
        case 9:
            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 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            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 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 14:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 15:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedHeatingSetpoint", value, 700));
            }
            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_CONSTRAINT_ERROR));
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("unoccupiedCoolingSetpoint", value, 2600));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            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 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 22:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("unoccupiedHeatingSetpoint", value, 2000));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 26:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 27:
            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 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 30:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 31:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 32:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minHeatSetpointLimit", value, 700));
                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));
            break;
        case 34:
            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 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), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 37:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 38:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 39:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 40:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("maxHeatSetpointLimit", value, 3000));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 700));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3000));
            }
            break;
        case 41:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 42:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 43:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 44:
            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 45:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            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), 0));
            break;
        case 48:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 49:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minCoolSetpointLimit", value, 1600));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 50:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 51:
            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 52:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 53:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_CONSTRAINT_ERROR));
            break;
        case 54:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 55:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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("maxCoolSetpointLimit", value, 3200));
                VerifyOrReturn(CheckConstraintType("value", "int16s", "int16s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1600));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 3200));
            }
            break;
        case 58:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 59:
            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 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), 0));
            break;
        case 67:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 68:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 69:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            {
                int8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("minSetpointDeadBand", value, 25));
                VerifyOrReturn(CheckConstraintType("value", "int8s", "int8s"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 25));
            }
            break;
        case 70:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 71:
            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 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));
            break;
        case 75:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 76:
            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 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::Thermostat::ThermostatControlSequence value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("controlSequenceOfOperation", value, 2U));
            }
            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));
            break;
        case 82:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 83:
            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 84:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 85:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 86:
            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 87:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 88:
            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 89:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 90:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 91:
            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 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));
            {
                int16_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("occupiedCoolingSetpoint", value, 2300));
            }
            break;
        case 96:
            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 97:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 98:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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("occupiedCoolingSetpoint", value, 2900));
            }
            break;
        case 101:
            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, "Reads OccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range");
            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 2: {
            LogStep(2, "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 3: {
            LogStep(3, "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 4: {
            LogStep(4, "Writes OccupiedCoolingSetpoint to value below the ABSMinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), 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 5: {
            LogStep(5, "Writes OccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), 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 6: {
            LogStep(6, "Writes the limit of MinCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && !TSTAT.S.F05"), 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 7: {
            LogStep(7, "Writes the CoolingSetpoint below the HeatingSetpoint when auto is enabled");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), 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 8: {
            LogStep(8, "Writes the limit of MaxCoolSetpointLimit to OccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01"), 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 9: {
            LogStep(9, "Reads OccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "Writes OccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), 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 13: {
            LogStep(13, "Writes OccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), 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 14: {
            LogStep(14, "Writes the limit of MinHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00"), 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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && !TSTAT.S.F05"), 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 17: {
            LogStep(17, "Writes the limit of MaxHeatSetpointLimit to OccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), 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 18: {
            LogStep(18, "Reads UnoccupiedCoolingSetpoint attribute from Server DUT and verifies that the value is within range");
            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 19: {
            LogStep(19, "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 20: {
            LogStep(20, "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 21: {
            LogStep(21, "Writes UnoccupiedCoolingSetpoint to value below the MinCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01"), 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 22: {
            LogStep(22, "Writes UnoccupiedCoolingSetpoint to value above the MaxCoolSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01"), 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 23: {
            LogStep(23, "Writes the limit of MinCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1800;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Writes the limit of MaxCoolSetpointLimit to UnoccupiedCoolingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F01"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 3000;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedCoolingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Reads UnoccupiedHeatingSetpoint attribute from Server DUT and verifies that the value is within range");
            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 26: {
            LogStep(26, "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 27: {
            LogStep(27, "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 28: {
            LogStep(28, "Writes UnoccupiedHeatingSetpoint to value below the MinHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00"), 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 29: {
            LogStep(29, "Writes UnoccupiedHeatingSetpoint to value above the MaxHeatSetpointLimit");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00"), 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 30: {
            LogStep(30, "Writes the limit of MinHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 1800;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id,
                                  Thermostat::Attributes::UnoccupiedHeatingSetpoint::Id, value, chip::NullOptional,
                                  chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Writes the limit of MaxHeatSetpointLimit to UnoccupiedHeatingSetpoint attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F02 && TSTAT.S.F00"), 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 32: {
            LogStep(32, "Reads MinHeatSetpointLimit attribute from Server DUT and verifies that the value is within range");
            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 33: {
            LogStep(33, "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 34: {
            LogStep(34, "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 35: {
            LogStep(35, "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 36: {
            LogStep(36, "Writes MinHeatSetpointLimit to value below the AbsMinHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00 && TSTAT.S.A0015"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            int16_t value;
            value = 650;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MinHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 37: {
            LogStep(37, "Writes MinHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0015"), 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 38: {
            LogStep(38, "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 39: {
            LogStep(39, "Writes the limit of AbsMaxHeatSetpointLimit to MinHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && 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 40: {
            LogStep(40, "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"),
                       return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxHeatSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "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 42: {
            LogStep(42, "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 43: {
            LogStep(43, "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 44: {
            LogStep(44, "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 45: {
            LogStep(45, "Writes MaxHeatSetpointLimit to value below the AbsMinHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016"), 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 46: {
            LogStep(46, "Writes MaxHeatSetpointLimit to value above the AbsMaxHeatSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016"), 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 47: {
            LogStep(47, "Writes the limit of AbsMinHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F00  && TSTAT.S.A0016"), 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 48: {
            LogStep(48, "Writes the limit of AbsMaxHeatSetpointLimit to MaxHeatSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("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::MaxHeatSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Reads MinCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            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 50: {
            LogStep(50, "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 51: {
            LogStep(51, "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 52: {
            LogStep(52, "Writes MinCoolSetpointLimit to value below the AbsMinCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0017"), 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 53: {
            LogStep(53, "Writes MinCoolSetpointLimit 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::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit attribute");
            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 55: {
            LogStep(55, "Writes the limit of MaxCoolSetpointLimit to MinCoolSetpointLimit 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::MinCoolSetpointLimit::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Writes the limit of AbsMinCoolSetpointLimit to MinCoolSetpointLimit attribute");
            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 57: {
            LogStep(57, "Reads MaxCoolSetpointLimit attribute from Server DUT and verifies that the value is within range");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), Thermostat::Id, Thermostat::Attributes::MaxCoolSetpointLimit::Id,
                                 true, chip::NullOptional);
        }
        case 58: {
            LogStep(58, "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 59: {
            LogStep(59, "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 60: {
            LogStep(60, "Writes MaxCoolSetpointLimit to value below the AbsMinCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018"), 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 61: {
            LogStep(61, "Writes MaxCoolSetpointLimit to value above the MaxCoolSetpointLimit ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018"), 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 62: {
            LogStep(62, "Writes the limit of AbsMinCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F01 && TSTAT.S.A0018"), 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 63: {
            LogStep(63, "Writes the limit of MaxCoolSetpointLimit to MaxCoolSetpointLimit attribute");
            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 64: {
            LogStep(64, "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 65: {
            LogStep(65, "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 66: {
            LogStep(66, "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 67: {
            LogStep(67, "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 68: {
            LogStep(68, "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 69: {
            LogStep(69, "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 70: {
            LogStep(70, "Writes a value back that is different but valid for MinSetpointDeadBand attribute");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), 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 71: {
            LogStep(71, "Reads it back again to confirm the successful write of MinSetpointDeadBand attribute");
            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 72: {
            LogStep(72, "Writes the value below MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), 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 73: {
            LogStep(73, "Writes the value above MinSetpointDeadBand ");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), 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 74: {
            LogStep(74, "Writes the min limit of MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), 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 75: {
            LogStep(75, "Writes the max limit of MinSetpointDeadBand");
            VerifyOrDo(!ShouldSkip("TSTAT.S.F05"), 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 76: {
            LogStep(76, "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 77: {
            LogStep(77, "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 78: {
            LogStep(78, "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 79: {
            LogStep(79, "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 80: {
            LogStep(80, "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 81: {
            LogStep(81, "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 82: {
            LogStep(82, "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 83: {
            LogStep(83, "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 84: {
            LogStep(84, "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 85: {
            LogStep(85, "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 86: {
            LogStep(86, "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 87: {
            LogStep(87, "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 88: {
            LogStep(88, "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 89: {
            LogStep(89, "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 90: {
            LogStep(90, "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 91: {
            LogStep(91, "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 92: {
            LogStep(92, "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 93: {
            LogStep(93, "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 94: {
            LogStep(94, "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 95: {
            LogStep(95, "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 96: {
            LogStep(96, "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 97: {
            LogStep(97, "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 98: {
            LogStep(98, "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 99: {
            LogStep(99, "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 100: {
            LogStep(100, "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 101: {
            LogStep(101, "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_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.A002f"), 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_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_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"), 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"), 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"), 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"), 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"), 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"), 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", 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_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(CheckConstraintType("value", "bitmap32", "bitmap32"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0UL));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 32768UL));
            }
            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, 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 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, 26UL));
            }
            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));
                VerifyOrReturn(CheckConstraintContains("value", value, 17UL));
            }
            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, 11UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 14UL));
            }
            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));
                VerifyOrReturn(CheckConstraintContains("value", value, 19UL));
            }
            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, 12UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 15UL));
            }
            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));
                VerifyOrReturn(CheckConstraintContains("value", value, 1UL));
                VerifyOrReturn(CheckConstraintContains("value", value, 2UL));
            }
            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, 5UL));
            }
            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, 7UL));
            }
            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, 8UL));
            }
            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 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"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), WindowCovering::Id, WindowCovering::Attributes::FeatureMap::Id,
                                 true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "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 4: {
            LogStep(4, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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 13: {
            LogStep(13, "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, 63U));
            }
            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, 63U));
            }
            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", 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_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(CheckConstraintMinValue("value", value, 5U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 21U));
            }
            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)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9999U));
            }
            break;
        case 16:
            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 17:
            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 18:
            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 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::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            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<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 24:
            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, "3a1: Verify DUT reports OperationalStatus attribute to TH after a UpOrOpen");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return WaitForReport();
        }
        case 14: {
            LogStep(14, "3a2: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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 18: {
            LogStep(18, "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 19: {
            LogStep(19, "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 20: {
            LogStep(20, "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 21: {
            LogStep(21, "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 22: {
            LogStep(22, "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 23: {
            LogStep(23, "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 24: {
            LogStep(24, "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", 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_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(CheckConstraintMinValue("value", value, 10U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 42U));
            }
            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)));
                VerifyOrReturn(CheckConstraintType("value", "Percent100ths", "Percent100ths"));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 1U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 10000U));
            }
            break;
        case 16:
            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 17:
            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 18:
            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 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::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            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<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 24:
            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: Verify DUT reports OperationalStatus attribute to TH after a DownOrClose");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return WaitForReport();
        }
        case 14: {
            LogStep(14, "3a2: DUT updates its attributes");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 2000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 15: {
            LogStep(15, "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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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 18: {
            LogStep(18, "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 19: {
            LogStep(19, "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 20: {
            LogStep(20, "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 21: {
            LogStep(21, "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 22: {
            LogStep(22, "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 23: {
            LogStep(23, "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 24: {
            LogStep(24, "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", 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_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(CheckConstraintType("value", "bitmap8", "bitmap8"));
            }
            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));
            {
                chip::BitMask<chip::app::Clusters::WindowCovering::OperationalStatus> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("operationalStatus", value, 0U));
            }
            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::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));
            {
                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 12:
            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 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));
                attrCurrentPositionTilt = 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 (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, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "2c: Verify DUT reports OperationalStatus attribute to TH after a StopMotion");
            VerifyOrDo(!ShouldSkip("WNCV.S.A000a"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return WaitForReport();
        }
        case 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12,
                    "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 13: {
            LogStep(13, "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 14: {
            LogStep(14,
                    "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"),
                       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::TestCluster::Bitmap8MaskMap>> nullableValue254;
    chip::app::DataModel::Nullable<chip::app::Clusters::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::Test::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Test Not Handled Command");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestNotHandled::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestNotHandled::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send Test Specific Command");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestSpecific::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestSpecific::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "Send failing Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestAddArguments::Type value;
            value.arg1 = 250U;
            value.arg2 = 6U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "Read attribute BOOLEAN Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute BOOLEAN True");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Read attribute BOOLEAN False");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read attribute BITMAP8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write attribute BITMAP8 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap>>(255U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute BITMAP8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Write attribute BITMAP8 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Read attribute BITMAP8 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read attribute BITMAP16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write attribute BITMAP16 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap>>(65535U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute BITMAP16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Write attribute BITMAP16 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap>>(0U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read attribute BITMAP16 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Write attribute BITMAP32 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap>>(4294967295UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read attribute BITMAP32 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Write attribute BITMAP32 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap>>(0UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Read attribute BITMAP32 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Write attribute BITMAP64 Max Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap>>(18446744073709551615ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read attribute BITMAP64 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Write attribute BITMAP64 Min Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap>>(0ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read attribute BITMAP64 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Read attribute INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read attribute INT8U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 35: {
            LogStep(35, "Read attribute INT8U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read attribute INT16U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read attribute INT16U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 40: {
            LogStep(40, "Read attribute INT16U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read attribute INT32U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Read attribute INT32U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 45: {
            LogStep(45, "Read attribute INT32U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read attribute INT64U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Read attribute INT64U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 50: {
            LogStep(50, "Read attribute INT64U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read attribute INT8S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 55: {
            LogStep(55, "Read attribute INT8S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 57: {
            LogStep(57, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 60: {
            LogStep(60, "Read attribute INT16S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 62: {
            LogStep(62, "Read attribute INT16S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 65: {
            LogStep(65, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 67: {
            LogStep(67, "Read attribute INT32S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Read attribute INT32S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 72: {
            LogStep(72, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 74: {
            LogStep(74, "Read attribute INT64S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 76: {
            LogStep(76, "Read attribute INT64S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 79: {
            LogStep(79, "Read attribute SINGLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 81: {
            LogStep(81, "Read attribute SINGLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 83: {
            LogStep(83, "Read attribute SINGLE large Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 85: {
            LogStep(85, "Read attribute SINGLE small Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::FloatSingle::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 87: {
            LogStep(87, "Read attribute SINGLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::FloatSingle::Id, true,
                                 chip::NullOptional);
        }
        case 88: {
            LogStep(88, "Read attribute DOUBLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 90: {
            LogStep(90, "Read attribute DOUBLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 92: {
            LogStep(92, "Read attribute DOUBLE large Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 94: {
            LogStep(94, "Read attribute DOUBLE small Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::FloatDouble::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 96: {
            LogStep(96, "Read attribute DOUBLE Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::FloatDouble::Id, true,
                                 chip::NullOptional);
        }
        case 97: {
            LogStep(97, "Read attribute ENUM8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 99: {
            LogStep(99, "Read attribute ENUM8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 101: {
            LogStep(101, "Read attribute ENUM8 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 102: {
            LogStep(102, "Read attribute ENUM16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 104: {
            LogStep(104, "Read attribute ENUM16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 106: {
            LogStep(106, "Read attribute ENUM16 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 107: {
            LogStep(107, "Read attribute OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 109: {
            LogStep(109, "Read attribute OCTET_STRING with embedded null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 111: {
            LogStep(111, "Read attribute OCTET_STRING with hex: format");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 113: {
            LogStep(113, "Read attribute OCTET_STRING with weird chars");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 115: {
            LogStep(115, "Read attribute OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 117: {
            LogStep(117, "Read attribute OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 119: {
            LogStep(119, "Read attribute LONG_OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::LongOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 121: {
            LogStep(121, "Read attribute LONG_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::LongOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 123: {
            LogStep(123, "Read attribute CHAR_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 125: {
            LogStep(125, "Read attribute CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 127: {
            LogStep(127, "Read attribute CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 129: {
            LogStep(129, "Read attribute LONG_CHAR_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::LongCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 131: {
            LogStep(131, "Read attribute LONG_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::ListLongOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 136: {
            LogStep(136, "Read attribute EPOCH_US Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 138: {
            LogStep(138, "Read attribute EPOCH_US Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 140: {
            LogStep(140, "Read attribute EPOCH_US Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 141: {
            LogStep(141, "Read attribute EPOCH_S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 143: {
            LogStep(143, "Read attribute EPOCH_S Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 145: {
            LogStep(145, "Read attribute EPOCH_S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 146: {
            LogStep(146, "Read attribute UNSUPPORTED");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Unsupported::Id, true,
                                 chip::NullOptional);
        }
        case 147: {
            LogStep(147, "Writeattribute UNSUPPORTED");
            ListFreer listFreer;
            bool value;
            value = 0;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Unsupported::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 148: {
            LogStep(148, "Send Test Command to unsupported endpoint");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(200), TestCluster::Id, TestCluster::Commands::Test::Id, value,
                               chip::NullOptional

            );
        }
        case 149: {
            LogStep(149, "Send Test Command to unsupported cluster");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), TestCluster::Id, TestCluster::Commands::Test::Id, value,
                               chip::NullOptional

            );
        }
        case 150: {
            LogStep(150, "Read attribute vendor_id Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 152: {
            LogStep(152, "Read attribute vendor_id");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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::TestCluster::Commands::TestEnumsRequest::Type value;
            value.arg1 = static_cast<chip::VendorId>(20003);
            value.arg2 = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(1);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Commands::TestEnumsRequest::Type value;
            value.arg1 = static_cast<chip::VendorId>(20003);
            value.arg2 = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(101);
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Commands::TestStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = true;
            value.arg1.c = static_cast<chip::app::Clusters::TestCluster::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::TestCluster::SimpleBitmap>>(1U);
            value.arg1.g = 0.0f;
            value.arg1.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::Commands::TestStructArgumentRequest::Type value;

            value.arg1.a = 0U;
            value.arg1.b = false;
            value.arg1.c = static_cast<chip::app::Clusters::TestCluster::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::TestCluster::SimpleBitmap>>(1U);
            value.arg1.g = 0.0f;
            value.arg1.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            {
                auto * listHolder_1 = new ListHolder<chip::app::Clusters::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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), TestCluster::Id,
                               TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::SimpleBitmap>>(1U);
            value.arg1.c.g = 0.0f;
            value.arg1.c.h = 0;

            {
                auto * listHolder_1 = new ListHolder<chip::app::Clusters::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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), TestCluster::Id,
                               TestCluster::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::TestCluster::Commands::SimpleStructEchoRequest::Type value;

            value.arg1.a = 17U;
            value.arg1.b = false;
            value.arg1.c = static_cast<chip::app::Clusters::TestCluster::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::TestCluster::SimpleBitmap>>(1U);
            value.arg1.g = 0.1f;
            value.arg1.h = 0.1;

            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::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), TestCluster::Id,
                               TestCluster::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::TestCluster::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), TestCluster::Id,
                               TestCluster::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::TestCluster::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), TestCluster::Id,
                               TestCluster::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::TestCluster::Commands::TestListInt8UReverseRequest::Type value;

            value.arg1 = chip::app::DataModel::List<uint8_t>();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::Commands::TestListStructArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::SimpleBitmap>>(1U);
                listHolder_0->mList[1].g = 0.0f;
                listHolder_0->mList[1].h = 0;

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::TestCluster::Structs::SimpleStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::Commands::TestListStructArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::SimpleBitmap>>(1U);
                listHolder_0->mList[1].g = 0.0f;
                listHolder_0->mList[1].h = 0;

                value.arg1 = chip::app::DataModel::List<chip::app::Clusters::TestCluster::Structs::SimpleStruct::Type>(
                    listHolder_0->mList, 2);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::Commands::TestListNestedStructListArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::Structs::NestedStructList::Type>(
                    listHolder_0->mList, 1);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::Commands::TestListNestedStructListArgumentRequest::Type value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::Structs::NestedStructList::Type>(
                    listHolder_0->mList, 1);
            }
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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), TestCluster::Id, TestCluster::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 172: {
            LogStep(172, "Read attribute LIST With List of INT8U");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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::TestCluster::Structs::TestListStructOctet::Type> value;

            {
                auto * listHolder_0 = new ListHolder<chip::app::Clusters::TestCluster::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::TestCluster::Structs::TestListStructOctet::Type>(
                    listHolder_0->mList, 4);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::Attributes::ListStructOctetString::Id, true, chip::NullOptional);
        }
        case 177: {
            LogStep(177, "Send Test Command with optional arg set.");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestNullableOptionalRequest::Type value;
            value.arg1.Emplace();
            value.arg1.Value().SetNonNull();
            value.arg1.Value().Value() = 5U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::Commands::TestNullableOptionalRequest::Id, value, chip::NullOptional

            );
        }
        case 178: {
            LogStep(178, "Send Test Command without its optional arg.");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestNullableOptionalRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::Commands::TestNullableOptionalRequest::Id, value, chip::NullOptional

            );
        }
        case 179: {
            LogStep(179, "Read list of structs containing nullables and optionals");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                 TestCluster::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::TestCluster::Structs::NullablesAndOptionalsStruct::Type> value;

            {
                auto * listHolder_0 =
                    new ListHolder<chip::app::Clusters::TestCluster::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::TestCluster::SimpleEnum>(2);
                    listFreer.add(listHolder_3);
                    listHolder_3->mList[0] = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(1);
                    listHolder_3->mList[1] = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(2);
                    listHolder_0->mList[0].nullableList.Value() =
                        chip::app::DataModel::List<chip::app::Clusters::TestCluster::SimpleEnum>(listHolder_3->mList, 2);
                }

                value = chip::app::DataModel::List<chip::app::Clusters::TestCluster::Structs::NullablesAndOptionalsStruct::Type>(
                    listHolder_0->mList, 1);
            }
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 183: {
            LogStep(183, "Read attribute NULLABLE_BOOLEAN null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableBoolean::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 185: {
            LogStep(185, "Read attribute NULLABLE_BOOLEAN True");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 186: {
            LogStep(186, "Read attribute NULLABLE_BOOLEAN not null");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap8MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap>>(254U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 188: {
            LogStep(188, "Read attribute NULLABLE_BITMAP8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap8MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap>>(255U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 190: {
            LogStep(190, "Read attribute NULLABLE_BITMAP8 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap8MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 192: {
            LogStep(192, "Read attribute NULLABLE_BITMAP8 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap8::Id,
                                 true, chip::NullOptional);
        }
        case 193: {
            LogStep(193, "Read attribute NULLABLE_BITMAP8 not 254 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap16MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap>>(65534U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 195: {
            LogStep(195, "Read attribute NULLABLE_BITMAP16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap16MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap>>(65535U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 197: {
            LogStep(197, "Read attribute NULLABLE_BITMAP16 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap16MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 199: {
            LogStep(199, "Read attribute NULLABLE_BITMAP16 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap32MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap>>(4294967294UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap32::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 201: {
            LogStep(201, "Read attribute NULLABLE_BITMAP32 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap32MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap>>(4294967295UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap32::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 203: {
            LogStep(203, "Read attribute NULLABLE_BITMAP32 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap32MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap32::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 205: {
            LogStep(205, "Read attribute NULLABLE_BITMAP32 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap64MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap>>(18446744073709551614ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap64::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 207: {
            LogStep(207, "Read attribute NULLABLE_BITMAP64 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap64MaskMap>> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap>>(18446744073709551615ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap64::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 209: {
            LogStep(209, "Read attribute NULLABLE_BITMAP64 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap64MaskMap>> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableBitmap64::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 211: {
            LogStep(211, "Read attribute NULLABLE_BITMAP64 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 213: {
            LogStep(213, "Read attribute NULLABLE_INT8U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 215: {
            LogStep(215, "Read attribute NULLABLE_INT8U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 217: {
            LogStep(217, "Read attribute NULLABLE_INT8U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 218: {
            LogStep(218, "Read attribute NULLABLE_INT8U unchanged Value with constraint");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 220: {
            LogStep(220, "Read attribute NULLABLE_INT8U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 221: {
            LogStep(221, "Read attribute NULLABLE_INT8U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 222: {
            LogStep(222, "Read attribute NULLABLE_INT8U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt8u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 224: {
            LogStep(224, "Read attribute NULLABLE_INT8U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 225: {
            LogStep(225, "Read attribute NULLABLE_INT8U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 227: {
            LogStep(227, "Read attribute NULLABLE_INT16U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 229: {
            LogStep(229, "Read attribute NULLABLE_INT16U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 231: {
            LogStep(231, "Read attribute NULLABLE_INT16U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 233: {
            LogStep(233, "Read attribute NULLABLE_INT16U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 234: {
            LogStep(234, "Read attribute NULLABLE_INT16U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 235: {
            LogStep(235, "Read attribute NULLABLE_INT16U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt16u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 237: {
            LogStep(237, "Read attribute NULLABLE_INT16U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt16u::Id, true,
                                 chip::NullOptional);
        }
        case 238: {
            LogStep(238, "Read attribute NULLABLE_INT16U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 240: {
            LogStep(240, "Read attribute NULLABLE_INT32U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 242: {
            LogStep(242, "Read attribute NULLABLE_INT32U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 244: {
            LogStep(244, "Read attribute NULLABLE_INT32U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 246: {
            LogStep(246, "Read attribute NULLABLE_INT32U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 247: {
            LogStep(247, "Read attribute NULLABLE_INT32U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 248: {
            LogStep(248, "Read attribute NULLABLE_INT32U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt32u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 250: {
            LogStep(250, "Read attribute NULLABLE_INT32U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt32u::Id, true,
                                 chip::NullOptional);
        }
        case 251: {
            LogStep(251, "Read attribute NULLABLE_INT32U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 253: {
            LogStep(253, "Read attribute NULLABLE_INT64U Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 255: {
            LogStep(255, "Read attribute NULLABLE_INT64U Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 257: {
            LogStep(257, "Read attribute NULLABLE_INT64U unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 259: {
            LogStep(259, "Read attribute NULLABLE_INT64U null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 260: {
            LogStep(260, "Read attribute NULLABLE_INT64U null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 261: {
            LogStep(261, "Read attribute NULLABLE_INT64U null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt64u::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 263: {
            LogStep(263, "Read attribute NULLABLE_INT64U Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt64u::Id, true,
                                 chip::NullOptional);
        }
        case 264: {
            LogStep(264, "Read attribute NULLABLE_INT64U notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 266: {
            LogStep(266, "Read attribute NULLABLE_INT8S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 268: {
            LogStep(268, "Read attribute NULLABLE_INT8S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 270: {
            LogStep(270, "Read attribute NULLABLE_INT8S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 271: {
            LogStep(271, "Read attribute NULLABLE_INT8S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 272: {
            LogStep(272, "Read attribute NULLABLE_INT8S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt8s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 274: {
            LogStep(274, "Read attribute NULLABLE_INT8S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt8s::Id, true,
                                 chip::NullOptional);
        }
        case 275: {
            LogStep(275, "Read attribute NULLABLE_INT8S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 277: {
            LogStep(277, "Read attribute NULLABLE_INT16S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 279: {
            LogStep(279, "Read attribute NULLABLE_INT16S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 281: {
            LogStep(281, "Read attribute NULLABLE_INT16S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 282: {
            LogStep(282, "Read attribute NULLABLE_INT16S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 283: {
            LogStep(283, "Read attribute NULLABLE_INT16S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt16s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 285: {
            LogStep(285, "Read attribute NULLABLE_INT16S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt16s::Id, true,
                                 chip::NullOptional);
        }
        case 286: {
            LogStep(286, "Read attribute NULLABLE_INT16S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 288: {
            LogStep(288, "Read attribute NULLABLE_INT32S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 290: {
            LogStep(290, "Read attribute NULLABLE_INT32S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 292: {
            LogStep(292, "Read attribute NULLABLE_INT32S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 293: {
            LogStep(293, "Read attribute NULLABLE_INT32S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 294: {
            LogStep(294, "Read attribute NULLABLE_INT32S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt32s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 296: {
            LogStep(296, "Read attribute NULLABLE_INT32S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt32s::Id, true,
                                 chip::NullOptional);
        }
        case 297: {
            LogStep(297, "Read attribute NULLABLE_INT32S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 299: {
            LogStep(299, "Read attribute NULLABLE_INT64S Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 301: {
            LogStep(301, "Read attribute NULLABLE_INT64S unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 303: {
            LogStep(303, "Read attribute NULLABLE_INT64S null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 304: {
            LogStep(304, "Read attribute NULLABLE_INT64S null Value & range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 305: {
            LogStep(305, "Read attribute NULLABLE_INT64S null Value & not");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableInt64s::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 307: {
            LogStep(307, "Read attribute NULLABLE_INT64S Value in range");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableInt64s::Id, true,
                                 chip::NullOptional);
        }
        case 308: {
            LogStep(308, "Read attribute NULLABLE_INT64S notValue OK");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 310: {
            LogStep(310, "Read attribute NULLABLE_SINGLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 312: {
            LogStep(312, "Read attribute NULLABLE_SINGLE largest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 314: {
            LogStep(314, "Read attribute NULLABLE_SINGLE smallest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 316: {
            LogStep(316, "Read attribute NULLABLE_SINGLE null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatSingle::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 318: {
            LogStep(318, "Read attribute NULLABLE_SINGLE 0 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 320: {
            LogStep(320, "Read attribute NULLABLE_DOUBLE medium Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 322: {
            LogStep(322, "Read attribute NULLABLE_DOUBLE largest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 324: {
            LogStep(324, "Read attribute NULLABLE_DOUBLE smallest Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 326: {
            LogStep(326, "Read attribute NULLABLE_DOUBLE null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableFloatDouble::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 328: {
            LogStep(328, "Read attribute NULLABLE_DOUBLE 0 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 330: {
            LogStep(330, "Read attribute NULLABLE_ENUM8 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 332: {
            LogStep(332, "Read attribute NULLABLE_ENUM8 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 334: {
            LogStep(334, "Read attribute NULLABLE_ENUM8 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableEnum8::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 336: {
            LogStep(336, "Read attribute NULLABLE_ENUM8 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 338: {
            LogStep(338, "Read attribute NULLABLE_ENUM16 Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 340: {
            LogStep(340, "Read attribute NULLABLE_ENUM16 Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 342: {
            LogStep(342, "Read attribute NULLABLE_ENUM16 unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableEnum16::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 344: {
            LogStep(344, "Read attribute NULLABLE_ENUM16 null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::SimpleEnum> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(0);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 346: {
            LogStep(346, "Read attribute NULLABLE_SIMPLE_ENUM Min Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::SimpleEnum> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(3);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 348: {
            LogStep(348, "Read attribute NULLABLE_SIMPLE_ENUM Max Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::SimpleEnum> value;
            value.SetNonNull();
            value.Value() = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(255);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 350: {
            LogStep(350, "Read attribute NULLABLE_SIMPLE_ENUM unchanged Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::SimpleEnum> value;
            value.SetNull();
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableEnumAttr::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 352: {
            LogStep(352, "Read attribute NULLABLE_SIMPLE_ENUM null Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 353: {
            LogStep(353, "Read attribute NULLABLE_SIMPLE_ENUM not 3 Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableEnumAttr::Id,
                                 true, chip::NullOptional);
        }
        case 354: {
            LogStep(354, "Read attribute NULLABLE_OCTET_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 356: {
            LogStep(356, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 358: {
            LogStep(358, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableOctetString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 360: {
            LogStep(360, "Read attribute NULLABLE_OCTET_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 361: {
            LogStep(361, "Read attribute NULLABLE_OCTET_STRING not TestValue");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableOctetString::Id,
                                 true, chip::NullOptional);
        }
        case 362: {
            LogStep(362, "Read attribute NULLABLE_CHAR_STRING Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 364: {
            LogStep(364, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 365: {
            LogStep(365, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 367: {
            LogStep(367, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::NullableCharString::Id,
                                  value, chip::NullOptional, chip::NullOptional);
        }
        case 369: {
            LogStep(369, "Read attribute NULLABLE_CHAR_STRING");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 370: {
            LogStep(370, "Read attribute NULLABLE_CHAR_STRING not ☉T☉");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::NullableCharString::Id,
                                 true, chip::NullOptional);
        }
        case 371: {
            LogStep(371, "Read attribute from nonexistent endpoint.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(200), TestCluster::Id, TestCluster::Attributes::ListInt8u::Id, true,
                                 chip::NullOptional);
        }
        case 372: {
            LogStep(372, "Read attribute from nonexistent cluster.");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), TestCluster::Id, TestCluster::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::TestCluster::Commands::TestSimpleOptionalArgumentRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::Commands::TestSimpleOptionalArgumentRequest::Type value;
            value.arg1.Emplace();
            value.arg1.Value() = 1;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::Commands::TestSimpleOptionalArgumentRequest::Id, value, chip::NullOptional

            );
        }
        case 375: {
            LogStep(375, "Subscribe to list attribute");
            return SubscribeAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id, TestCluster::Attributes::RangeRestrictedInt8u::Id,
                                 true, chip::NullOptional);
        }
        case 390: {
            LogStep(390, "Read range-restricted unsigned 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::Attributes::RangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 402: {
            LogStep(402, "Read range-restricted signed 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id, TestCluster::Attributes::RangeRestrictedInt8s::Id,
                                 true, chip::NullOptional);
        }
        case 414: {
            LogStep(414, "Read range-restricted signed 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::Attributes::RangeRestrictedInt16s::Id, true, chip::NullOptional);
        }
        case 426: {
            LogStep(426, "Read nullable range-restricted unsigned 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::Attributes::NullableRangeRestrictedInt8u::Id, true, chip::NullOptional);
        }
        case 440: {
            LogStep(440, "Read nullable range-restricted unsigned 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::Attributes::NullableRangeRestrictedInt16u::Id, true, chip::NullOptional);
        }
        case 454: {
            LogStep(454, "Read nullable range-restricted signed 8-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::Attributes::NullableRangeRestrictedInt8s::Id, true, chip::NullOptional);
        }
        case 468: {
            LogStep(468, "Read nullable range-restricted signed 16-bit integer");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id,
                                  TestCluster::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), TestCluster::Id,
                                 TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::GeneralErrorBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 485: {
            LogStep(485, "read attribute that returns cluster-specific status on read");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::ClusterErrorBoolean::Id,
                                 true, chip::NullOptional);
        }
        case 486: {
            LogStep(486, "read AcceptedCommandList attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::AcceptedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 487: {
            LogStep(487, "read GeneratedCommandList attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::GeneratedCommandList::Id,
                                 true, chip::NullOptional);
        }
        case 488: {
            LogStep(488, "Write struct-typed attribute");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Structs::SimpleStruct::Type value;

            value.a = 5U;
            value.b = true;
            value.c = static_cast<chip::app::Clusters::TestCluster::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::TestCluster::SimpleBitmap>>(17U);
            value.g = 1.5f;
            value.h = 3.14159265358979;

            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::StructAttr::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 489: {
            LogStep(489, "Read struct-typed attribute");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::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::TestCluster::Commands::TestNullableOptionalRequest::Type value;
            value.arg1.Emplace();
            value.arg1.Value().SetNull();
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                               TestCluster::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::TestCluster::Commands::TimedInvokeRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Commands::TimedInvokeRequest::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Commands::TimedInvokeRequest::Type value;
            ReturnErrorOnFailure(SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id,
                                             TestCluster::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::TestCluster::Commands::Test::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Commands::Test::Type value;
            ReturnErrorOnFailure(SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                                TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id,
                                                TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::ListInt8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 5: {
            LogStep(5, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Write attribute BITMAP32 with MaskVal1 and MaskVal3");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap>>(5UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Read attribute INT32U Value MinValue Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute INT32U Value MaxValue Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read attribute INT32U Value NotValue Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Read attribute CHAR_STRING Value MinLength Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute CHAR_STRING Value MaxLength Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read attribute CHAR_STRING Value StartsWith Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::CharString::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Read attribute CHAR_STRING Value EndsWith Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read attribute CHAR_STRING Value isHexString Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 30: {
            LogStep(30, "Read attribute CHAR_STRING Value isHexString Constraints");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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), TestCluster::Id, TestCluster::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Check reading events from an invalid endpoint");
            mTestSubStepCount = 0;
            return ReadEvent(kIdentityAlpha, GetEndpoint(0), TestCluster::Id, TestCluster::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Generate an event on the accessory");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestEmitTestEventRequest::Type value;
            value.arg1 = 1U;
            value.arg2 = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(2);
            value.arg3 = true;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestEmitTestEventRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Read the event back");
            mTestSubStepCount = 1;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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::TestCluster::Commands::TestEmitTestEventRequest::Type value;
            value.arg1 = 3U;
            value.arg2 = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(4);
            value.arg3 = false;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestEmitTestEventRequest::Id,
                               value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Read the event back");
            mTestSubStepCount = 2;
            return ReadEvent(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Events::TestEvent::Id, false,
                             chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Subscribe to the event");
            mTestSubStepCount = 2;
            return SubscribeEvent(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Commands::TestEmitTestEventRequest::Type value;
            value.arg1 = 4U;
            value.arg2 = static_cast<chip::app::Clusters::TestCluster::SimpleEnum>(3);
            value.arg3 = true;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::TestCluster::Bitmap8MaskMap> readAttributeBitmap8DefaultValue;
    chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap> readAttributeBitmap16DefaultValue;
    chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap> readAttributeBitmap32DefaultValue;
    chip::BitMask<chip::app::Clusters::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = TestAddArgumentDefaultValue;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 4: {
            LogStep(4, "Read attribute BOOLEAN Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Read attribute BOOLEAN Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Boolean::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 8: {
            LogStep(8, "Read attribute BOOLEAN False");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Boolean::Id, true,
                                 chip::NullOptional);
        }
        case 9: {
            LogStep(9, "Read attribute BITMAP8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 10: {
            LogStep(10, "Write attribute BITMAP8 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap>>(1U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 11: {
            LogStep(11, "Read attribute BITMAP8 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 12: {
            LogStep(12, "Write attribute BITMAP8 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap8MaskMap> value;
            value = readAttributeBitmap8DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 13: {
            LogStep(13, "Read attribute BITMAP8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap8::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "Read attribute BITMAP16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 15: {
            LogStep(15, "Write attribute BITMAP16 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap>>(1U);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 16: {
            LogStep(16, "Read attribute BITMAP16 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 17: {
            LogStep(17, "Write attribute BITMAP16 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap16MaskMap> value;
            value = readAttributeBitmap16DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 18: {
            LogStep(18, "Read attribute BITMAP16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap16::Id, true,
                                 chip::NullOptional);
        }
        case 19: {
            LogStep(19, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 20: {
            LogStep(20, "Write attribute BITMAP32 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap>>(1UL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 21: {
            LogStep(21, "Read attribute BITMAP32 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 22: {
            LogStep(22, "Write attribute BITMAP32 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap32MaskMap> value;
            value = readAttributeBitmap32DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 23: {
            LogStep(23, "Read attribute BITMAP32 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap32::Id, true,
                                 chip::NullOptional);
        }
        case 24: {
            LogStep(24, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 25: {
            LogStep(25, "Write attribute BITMAP64 Not Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap> value;
            value = static_cast<chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap>>(1ULL);
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 26: {
            LogStep(26, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 27: {
            LogStep(27, "Write attribute BITMAP64 Default Value");
            ListFreer listFreer;
            chip::BitMask<chip::app::Clusters::TestCluster::Bitmap64MaskMap> value;
            value = readAttributeBitmap64DefaultValue;
            return WriteAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 28: {
            LogStep(28, "Read attribute BITMAP64 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Bitmap64::Id, true,
                                 chip::NullOptional);
        }
        case 29: {
            LogStep(29, "Read attribute INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 31: {
            LogStep(31, "Read attribute INT8U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int8u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 33: {
            LogStep(33, "Read attribute INT8U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int8u::Id, true,
                                 chip::NullOptional);
        }
        case 34: {
            LogStep(34, "Read attribute INT16U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 36: {
            LogStep(36, "Read attribute INT16U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int16u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 38: {
            LogStep(38, "Read attribute INT16U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int16u::Id, true,
                                 chip::NullOptional);
        }
        case 39: {
            LogStep(39, "Read attribute INT32U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 41: {
            LogStep(41, "Read attribute INT32U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 43: {
            LogStep(43, "Read attribute INT32U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int32u::Id, true,
                                 chip::NullOptional);
        }
        case 44: {
            LogStep(44, "Read attribute INT64U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 46: {
            LogStep(46, "Read attribute INT64U Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int64u::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 48: {
            LogStep(48, "Read attribute INT64U Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int64u::Id, true,
                                 chip::NullOptional);
        }
        case 49: {
            LogStep(49, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 51: {
            LogStep(51, "Read attribute INT8S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int8s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 53: {
            LogStep(53, "Read attribute INT8S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int8s::Id, true,
                                 chip::NullOptional);
        }
        case 54: {
            LogStep(54, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 56: {
            LogStep(56, "Read attribute INT16S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int16s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 58: {
            LogStep(58, "Read attribute INT16S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int16s::Id, true,
                                 chip::NullOptional);
        }
        case 59: {
            LogStep(59, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 61: {
            LogStep(61, "Read attribute INT32S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int32s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 63: {
            LogStep(63, "Read attribute INT32S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int32s::Id, true,
                                 chip::NullOptional);
        }
        case 64: {
            LogStep(64, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 66: {
            LogStep(66, "Read attribute INT64S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Int64s::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 68: {
            LogStep(68, "Read attribute INT64S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Int64s::Id, true,
                                 chip::NullOptional);
        }
        case 69: {
            LogStep(69, "Read attribute ENUM8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 71: {
            LogStep(71, "Read attribute ENUM8 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Enum8::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 73: {
            LogStep(73, "Read attribute ENUM8 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Enum8::Id, true,
                                 chip::NullOptional);
        }
        case 74: {
            LogStep(74, "Read attribute ENUM16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 76: {
            LogStep(76, "Read attribute ENUM16 Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::Enum16::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 78: {
            LogStep(78, "Read attribute ENUM16 Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::Enum16::Id, true,
                                 chip::NullOptional);
        }
        case 79: {
            LogStep(79, "Read attribute EPOCH_US Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 81: {
            LogStep(81, "Read attribute EPOCH_US Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::EpochUs::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 83: {
            LogStep(83, "Read attribute EPOCH_US Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::EpochUs::Id, true,
                                 chip::NullOptional);
        }
        case 84: {
            LogStep(84, "Read attribute EPOCH_S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 86: {
            LogStep(86, "Read attribute EPOCH_S Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::EpochS::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 88: {
            LogStep(88, "Read attribute EPOCH_S Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::EpochS::Id, true,
                                 chip::NullOptional);
        }
        case 89: {
            LogStep(89, "Read attribute vendor_id Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 91: {
            LogStep(91, "Read attribute vendor_id Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::VendorId::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 93: {
            LogStep(93, "Read attribute vendor_id Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Attributes::VendorId::Id, true,
                                 chip::NullOptional);
        }
        case 94: {
            LogStep(94, "Read attribute char_string Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 97: {
            LogStep(97, "Read attribute char_string Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::CharString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 102: {
            LogStep(102, "Read attribute octet_string Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::Attributes::OctetString::Id, value,
                                  chip::NullOptional, chip::NullOptional);
        }
        case 105: {
            LogStep(105, "Read attribute octet_string Not Default Value");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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), TestCluster::Id, TestCluster::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::TestCluster::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::TestCluster::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::TestCluster::Commands::TestAddArguments::Type value;
            value.arg1 = 3U;
            value.arg2 = 17U;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::Commands::TestAddArguments::Id, value,
                               chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Send Test Add Arguments Command");
            ListFreer listFreer;
            chip::app::Clusters::TestCluster::Commands::TestAddArguments::Type value;
            value.arg1 = mArg1.HasValue() ? mArg1.Value() : 5U;
            value.arg2 = TestAddArgumentDefaultValue;
            return SendCommand(kIdentityAlpha, GetEndpoint(1), TestCluster::Id, TestCluster::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::DeviceType::DecodableType> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                {
                    auto iter_0 = value.begin();
                    VerifyOrReturn(CheckNextListItemDecodes<decltype(value)>("deviceList", iter_0, 0));
                    VerifyOrReturn(CheckValue("deviceList[0].type", iter_0.GetValue().type, 22UL));
                    VerifyOrReturn(CheckValue("deviceList[0].revision", iter_0.GetValue().revision, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("deviceList", 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(CheckNoMoreListItems<decltype(value)>("serverList", iter_0, 26));
                }
            }
            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::DeviceList::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("alphaIndex", 0, UINT8_MAX, &mAlphaIndex);
        AddArgument("betaIndex", 0, UINT8_MAX, &mBetaIndex);
        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<uint8_t> mAlphaIndex;
    chip::Optional<uint8_t> mBetaIndex;
    chip::Optional<uint16_t> mTimeout;

    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)));
                VerifyOrReturn(CheckValue("currentFabricIndex", value, mAlphaIndex.HasValue() ? mAlphaIndex.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(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));
            {
                uint8_t 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(), mAlphaIndex.HasValue() ? mAlphaIndex.Value() : 1U));
            }
            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));
            {
                uint8_t 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));
            {
                uint8_t 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)));
                VerifyOrReturn(CheckValue("currentFabricIndex", value, mBetaIndex.HasValue() ? mBetaIndex.Value() : 2U));
            }
            break;
        case 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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("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(), mBetaIndex.HasValue() ? mBetaIndex.Value() : 2U));
            }
            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));
            {
                uint8_t 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 = mBetaIndex.HasValue() ? mBetaIndex.Value() : 2U;
            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));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.HasValue(), true));
            VerifyOrReturn(CheckValue("clusterStatus", status.mClusterStatus.Value(), 9));
            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_2_1Suite : public TestCommand
{
public:
    Test_TC_DGSW_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_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_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)
        {
        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::SoftwareDiagnostics::Structs::ThreadMetrics::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));
            {
                uint64_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintType("value", "int64u", "int64u"));
            }
            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));
            {
                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, "Reads a list of ThreadMetrics struct non-global attribute from DUT.");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::ThreadMetrics::Id, true, chip::NullOptional);
        }
        case 2: {
            LogStep(2, "Reads CurrentHeapFree non-global attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::CurrentHeapFree::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads CurrentHeapUsed non-global attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::CurrentHeapUsed::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads CurrentHeapHighWaterMark non-global attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::CurrentHeapHighWatermark::Id, true, chip::NullOptional);
        }
        }
        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", 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_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)
        {
        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 a list of SoftwareFault struct from DUT and data type in each field of the struct must match the value "
                    "listed in spec");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DGSW.S.E00"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
            value.message = chip::Span<const char>("Please enter '0' for successgarbage: not in length on purpose", 28);
            value.expectedValue.Emplace();
            value.expectedValue.Value() = chip::Span<const char>("0garbage: not in length on purpose", 1);
            return UserPrompt(kIdentityAlpha, value);
        }
        }
        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", 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_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)
        {
        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::SoftwareDiagnostics::Structs::ThreadMetrics::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));
            {
                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));
            {
                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, "Sends ResetWatermarks to DUT");
            VerifyOrDo(!ShouldSkip("DGSW.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::SoftwareDiagnostics::Commands::ResetWatermarks::Type value;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                               SoftwareDiagnostics::Commands::ResetWatermarks::Id, value, chip::NullOptional

            );
        }
        case 2: {
            LogStep(2, "Reads a list of ThreadMetrics struct attribute from DUT.");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0001"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::ThreadMetrics::Id, true, chip::NullOptional);
        }
        case 3: {
            LogStep(3, "Reads CurrentHeapUsed attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0002"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::CurrentHeapUsed::Id, true, chip::NullOptional);
        }
        case 4: {
            LogStep(4, "Reads CurrentHeapHighWaterMark attribute value from DUT");
            VerifyOrDo(!ShouldSkip("DGSW.S.A0003"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), SoftwareDiagnostics::Id,
                                 SoftwareDiagnostics::Attributes::CurrentHeapHighWatermark::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 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_2_2Suite : public TestCommand
{
public:
    Test_TC_DRLK_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_2_2", 28, 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));
            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));
            shouldContinue = true;
            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));
            break;
        case 27:
            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, "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>(10000), 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>(10000), 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>(10000), chip::NullOptional

            );
        }
        case 10: {
            LogStep(10, "TH writes the RequirePINforRemoteOperation attribute value as True 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 True 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>(10000), 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>(10000), 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>(10000), 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.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.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 send "
                    "the 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 19: {
            LogStep(19,
                    "TH writes UserCodeTemporaryDisableTime attribute value as 15 seconds 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 20: {
            LogStep(20, "TH sends Lock Door Command to the DUT with invalid 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("123458garbage: 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 21: {
            LogStep(21, "TH sends Lock Door Command to the DUT with invalid 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("123458garbage: 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 22: {
            LogStep(22, "TH sends Lock Door Command to the DUT with invalid 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("123458garbage: 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 23: {
            LogStep(23, "TH sends Lock Door Command to the DUT with invalid 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("123458garbage: 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 24: {
            LogStep(24,
                    "TH reads UserCodeTemporaryDisableTime attribute from DUT and After sending 3 failure responses verify that "
                    "UserCodeTemporaryDisableTime attribute is triggered");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.S.A0031"), 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 25: {
            LogStep(
                25,
                "TH sends Lock Command to the DUT with valid PINCode before UserCodeTemporaryDisableTime attribute time expires");
            VerifyOrDo(!ShouldSkip("PICS_USER_PROMPT && DRLK.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' 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, "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>(10000), chip::NullOptional

            );
        }
        case 27: {
            LogStep(27, "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>(10000), 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", 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_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::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), 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));
            {
                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 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>(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, "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>(10000), 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, "Precondition: Door is in locked state");
            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>(10000), chip::NullOptional

            );
        }
        case 6: {
            LogStep(6, "TH writes AutoRelockTime attribute value as 10 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 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>(10000), chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "Wait 10000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 10000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 9: {
            LogStep(9, "TH reads LockState attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0000"), 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>(10000), 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>(10000), 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", 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_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));
            {
                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));
            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));
            {
                uint32_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("autoRelockTime", value, 10UL));
            }
            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<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;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(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 lock/unlock user");
            VerifyOrDo(!ShouldSkip("DRLK.S.C22.Rsp"), 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.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, "Precondition: Door is in locked state");
            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>(10000), chip::NullOptional

            );
        }
        case 3: {
            LogStep(3, "TH writes AutoRelockTime attribute value as 10 seconds on the DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023"), 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 4: {
            LogStep(4, "TH sends the unlock with Timeout command to the DUT ");
            VerifyOrDo(!ShouldSkip("DRLK.S.C03.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::DoorLock::Commands::UnlockWithTimeout::Type value;
            value.timeout = 5U;
            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>(10000), chip::NullOptional

            );
        }
        case 5: {
            LogStep(5, "TH reads AutoRelockTime attribute from DUT");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0023"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::AutoRelockTime::Id, true,
                                 chip::NullOptional);
        }
        case 6: {
            LogStep(6, "Wait 5000ms");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 5000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 7: {
            LogStep(7, "TH reads LockState attribute");
            VerifyOrDo(!ShouldSkip("DRLK.S.A0000"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), DoorLock::Id, DoorLock::Attributes::LockState::Id, true,
                                 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, 2U));
                VerifyOrReturn(CheckValue("userIndex", value.userIndex, 21U));
                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, 10U));
                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.F04 && 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.C.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.F04 && 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.F04 && 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.F04 && 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 = 2U;
            value.userIndex    = 21U;
            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.F04 && 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 = 10U;
            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.F04 && 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.F04 && 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.F04 && 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.F04 && 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", 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_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));
            {
                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(), 2U));
            }
            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::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(), 4U));
            }
            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::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(), 4U));
            }
            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));
            {
                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 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::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 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::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 20:
            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 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_INVALID_COMMAND));
            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;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(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.C.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.SetNonNull();
            value.userIndex.Value() = 2U;
            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.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 8: {
            LogStep(8, "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 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");
            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 = 3U;

            value.credentialData = chip::ByteSpan(chip::Uint8::from_const_char("123456garbage: not in length on purpose"), 6);
            value.userIndex.SetNonNull();
            value.userIndex.Value() = 3U;
            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 11: {
            LogStep(11,
                    "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 12: {
            LogStep(12, "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>(2);

            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() = 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 13: {
            LogStep(13,
                    "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 14: {
            LogStep(14, "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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "TH sends Set User Command to DUT");
            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 17: {
            LogStep(17, "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 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>(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 19: {
            LogStep(19, "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 20: {
            LogStep(20, "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 21: {
            LogStep(21, "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 22: {
            LogStep(22, "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 23: {
            LogStep(23, "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", 21, 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(CheckValue("maxGroupKeysPerFabric", 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));
            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), 0));
            break;
        case 8:
            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, 418U));
                    VerifyOrReturn(CheckValue("groupKeyMap[1].fabricIndex", iter_0.GetValue().fabricIndex, 1U));
                    VerifyOrReturn(CheckNoMoreListItems<decltype(value)>("groupKeyMap", iter_0, 2));
                }
            }
            break;
        case 9:
            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 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::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 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 13:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_NOT_FOUND));
            break;
        case 14:
            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 15:
            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 16:
            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 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::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 19:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 20:
            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");
            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 = 418U;
                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 8: {
            LogStep(8, "Read Group Keys");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupKeyMap::Id, true, chip::NullOptional);
        }
        case 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "Read GroupTable");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 12: {
            LogStep(12, "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 13: {
            LogStep(13, "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 14: {
            LogStep(14, "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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "Read GroupTable 2");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 17: {
            LogStep(17, "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 18: {
            LogStep(18, "Read GroupTable 3");
            return ReadAttribute(kIdentityAlpha, GetEndpoint(0), GroupKeyManagement::Id,
                                 GroupKeyManagement::Attributes::GroupTable::Id, true, chip::NullOptional);
        }
        case 19: {
            LogStep(19, "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 20: {
            LogStep(20, "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_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));
            {
                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 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;
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(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, "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 2: {
            LogStep(2, "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 3: {
            LogStep(3, "Map Group Key Set to group ID on a given fabric");
            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   = 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 4: {
            LogStep(4, "Install ACLs for test");
            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_1_1Suite : public TestCommand
{
public:
    Test_TC_G_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_1Suite : public TestCommand
{
public:
    Test_TC_G_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_G_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_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;

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

    //
    // Tests methods
    //

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

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

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_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_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_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_1_1Suite : public TestCommand
{
public:
    Test_TC_DLOG_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DLOG_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_1_1Suite : public TestCommand
{
public:
    Test_TC_DGETH_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGETH_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_2_2Suite : public TestCommand
{
public:
    Test_TC_ILL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ILL_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_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::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

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

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

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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", 0, 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_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_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", 0, 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_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_CADMIN_1_16Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_16Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_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_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::CharSpan> mCluster;
    chip::Optional<chip::EndpointId> mEndpoint;
    chip::Optional<uint16_t> mTimeout;

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

    //
    // Tests methods
    //

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

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

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_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", 0, 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_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_CADMIN_1_22Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_22Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_CADMIN_1_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_CADMIN_1_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_CADMIN_1_3Suite : public TestCommand
{
public:
    Test_TC_CADMIN_1_3Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_CADMIN_1_3", 19, 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));
            break;
        case 5:
            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 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::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 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(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 10:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            break;
        case 11:
            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 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("chiptest2", 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));
            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(CheckValue("windowStatus", 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), 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.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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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_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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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, true, chip::NullOptional);
        }
        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_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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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 13: {
            LogStep(13, "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 14: {
            LogStep(14, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 18: {
            LogStep(18, "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", 19, 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));
            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));
            }
            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::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 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(CheckNoMoreListItems<decltype(value)>("fabrics", iter_0, 1));
                }
                VerifyOrReturn(CheckConstraintType("value", "list", "list"));
            }
            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::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 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));
            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(CheckValue("windowStatus", 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), 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 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, "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 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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, true, chip::NullOptional);
        }
        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, true, chip::NullOptional);
        }
        case 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 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(kIdentityBeta, 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(kIdentityBeta, GetEndpoint(0), Basic::Id, Basic::Attributes::NodeLabel::Id, true,
                                 chip::NullOptional);
        }
        case 14: {
            LogStep(14, "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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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 18: {
            LogStep(18, "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", 18, 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), EMBER_ZCL_STATUS_FAILURE));
            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));
            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));
            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::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
            }
            break;
        case 12:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            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), 0));
            shouldContinue = true;
            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), 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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 PIXIT.CADMIN.CwDuration + 10 seconds");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 190000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "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 6: {
            LogStep(6, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 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 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, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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(
                                     "\006\307V\337\374\327\042e4R\241-\315\224]\214T\332+\017<\275\033M\303\361\255\262#"
                                     "\256\262k\004|\322L\226\206o\227\233\035\203\354P\342\264\2560\315\362\375\263+"
                                     "\330\242\021\2707\334\224\355\315V\364\321Cw\031\020v\277\305\235\231\267\3350S\357\326\360,"
                                     "D4\362\275\322z"),
                                 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 13: {
            LogStep(13, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 14: {
            LogStep(14, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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_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, "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 17: {
            LogStep(17, "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", 18, 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), EMBER_ZCL_STATUS_FAILURE));
            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));
            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));
            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::CharSpan value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueAsString("nodeLabel", value, chip::CharSpan("chiptest", 8)));
            }
            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_FAILURE));
            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), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 17:
            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, "Wait for PIXIT.CADMIN.CwDuration + 10");
            ListFreer listFreer;
            chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
            value.ms = 190000UL;
            return WaitForMs(kIdentityAlpha, value);
        }
        case 5: {
            LogStep(5, "Commission from beta");
            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 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_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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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 13: {
            LogStep(13, "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 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, "TH_CR2 starts a commissioning process on DUT_CE");
            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 16: {
            LogStep(16, "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 17: {
            LogStep(17, "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", 31, 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;

    uint8_t tempFabricIndex;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                tempFabricIndex = value;
            }
            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;
        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));
            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;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 29:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 30:
            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,
                    "Open commissioning window exactly like we plan to later to verify that `correctPayload` can in fact commision "
                    "the device.");
            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(
                                     "\006\307V\337\374\327\042e4R\241-\315\224]\214T\332+\017<\275\033M\303\361\255\262#"
                                     "\256\262k\004|\322L\226\206o\227\233\035\203\354P\342\264\2560\315\362\375\263+"
                                     "\330\242\021\2707\334\224\355\315V\364\321Cw\031\020v\277\305\235\231\267\3350S\357\326\360,"
                                     "D4\362\275\322z\244\371\316\247\015s\216L"),
                                 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, "Temporarily commission device with `correctPayload` just like we will try to later");
            VerifyOrDo(!ShouldSkip("CADMIN.S && 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 =
                mCorrectPayload.HasValue() ? mCorrectPayload.Value() : chip::Span<const char>("MT:-24J0AFN00I31506010", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 5: {
            LogStep(5, "Wait for a CASE session");
            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, "Read FabricIndex of beta so we can delete the temp fabric");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Remove the temp fabric");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C00.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = tempFabricIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "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(
                                     "\006\307V\337\374\327\042e4R\241-\315\224]\214T\332+\017<\275\033M\303\361\255\262#"
                                     "\256\262k\004|\322L\226\206o\227\233\035\203\354P\342\264\2560\315\362\375\263+"
                                     "\330\242\021\2707\334\224\355\315V\364\321Cw\031\020v\277\305\235\231\267\3350S\357\326\360,"
                                     "D4\362\275\322z\244\371\316\247\015s\216L"),
                                 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 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 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 26: {
            LogStep(26, "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 27: {
            LogStep(27, "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 28: {
            LogStep(28, "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 29: {
            LogStep(29, "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 30: {
            LogStep(30, "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", 30, 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;

    uint8_t tempFabricIndex;

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                tempFabricIndex = value;
            }
            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;
        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));
            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;
        case 27:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 28:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            shouldContinue = true;
            break;
        case 29:
            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,
                    "Open commissioning window exactly like we plan to later to verify that `correctPayload` can in fact commision "
                    "the device.");
            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, "Temporarily commission device with `correctPayload` just like we will try to later");
            VerifyOrDo(!ShouldSkip("CADMIN.S && 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 =
                mCorrectPayload.HasValue() ? mCorrectPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
            return PairWithCode(kIdentityBeta, value);
        }
        case 5: {
            LogStep(5, "Wait for a CASE session");
            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, "Read FabricIndex of beta so we can delete the temp fabric");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityBeta, GetEndpoint(0), OperationalCredentials::Id,
                                 OperationalCredentials::Attributes::CurrentFabricIndex::Id, true, chip::NullOptional);
        }
        case 7: {
            LogStep(7, "Remove the temp fabric");
            VerifyOrDo(!ShouldSkip("CADMIN.S.C01.Rsp"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            ListFreer listFreer;
            chip::app::Clusters::OperationalCredentials::Commands::RemoveFabric::Type value;
            value.fabricIndex = tempFabricIndex;
            return SendCommand(kIdentityAlpha, GetEndpoint(0), OperationalCredentials::Id,
                               OperationalCredentials::Commands::RemoveFabric::Id, value, chip::NullOptional

            );
        }
        case 8: {
            LogStep(8, "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 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");
            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 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 26: {
            LogStep(26, "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 27: {
            LogStep(27, "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 28: {
            LogStep(28, "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 29: {
            LogStep(29, "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", 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("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));
            {
                uint8_t 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));
            {
                chip::app::DataModel::Nullable<chip::FabricIndex> value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValueNonNull("value", value));
            }
            break;
        case 6:
            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 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));
            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));
            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::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 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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckValue("windowStatus", value, 1U));
            }
            break;
        case 18:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), EMBER_ZCL_STATUS_FAILURE));
            break;
        case 19:
            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 20:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            shouldContinue = true;
            break;
        case 21:
            VerifyOrReturn(CheckValue("status", chip::to_underlying(status.mStatus), 0));
            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), 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(CheckValue("windowStatus", value, 0U));
            }
            break;
        case 25:
            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 26:
            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");
            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 6: {
            LogStep(6, "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);
        }
        case 7: {
            LogStep(7, "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 8: {
            LogStep(8, "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 9: {
            LogStep(9, "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 10: {
            LogStep(10, "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 11: {
            LogStep(11, "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 12: {
            LogStep(12, "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 13: {
            LogStep(13, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 14: {
            LogStep(14, "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 15: {
            LogStep(15, "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 16: {
            LogStep(16, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 17: {
            LogStep(17, "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 18: {
            LogStep(18, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 19: {
            LogStep(19, "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 20: {
            LogStep(20, "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 21: {
            LogStep(21, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 22: {
            LogStep(22, "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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 23: {
            LogStep(23, "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 24: {
            LogStep(24, "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 25: {
            LogStep(25, "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 26: {
            LogStep(26, "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(330)); }

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));
            {
                uint8_t 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));
            {
                uint8_t 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 301 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(330)); }

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));
            {
                uint8_t 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));
            {
                uint8_t 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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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 301 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(
                          "\271ap\252\350\0034h\204rO\351\243\262\207\303\0030\302\246`7]\027\273 "
                          "Z\214\361\256\3135\004W\370\253y\356%:\266\250\344k\260\236T:\344\042sm\345\001\343\3337\324A\3764I "
                          "\320\225H\344\301\202@c\014O\364\221<SQ89\267\300\177\314\006'\241\270W:\024\237\315\037\244f\317"),
                      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_1Suite : public TestCommand
{
public:
    Test_TC_PSCFG_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PSCFG_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_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_DGSW_1_1Suite : public TestCommand
{
public:
    Test_TC_DGSW_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGSW_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_1_1Suite : public TestCommand
{
public:
    Test_TC_DGWIFI_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DGWIFI_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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", 0, 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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_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_OCC_3_2Suite : public TestCommand
{
public:
    Test_TC_OCC_3_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_OCC_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_OCC_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_PRS_2_2Suite : public TestCommand
{
public:
    Test_TC_PRS_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_PRS_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_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::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.HasValue() ? mEndpoint.Value() : endpoint; }

    //
    // Tests methods
    //

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

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

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

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        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(150)); }

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

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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, 98U));
            }
            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(CheckValue("currentHue", value, 120U));
            }
            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(CheckValue("currentHue", value, 120U));
            }
            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));
            {
                uint8_t value;
                VerifyOrReturn(CheckDecodeValue(chip::app::DataModel::Decode(*data, value)));
                VerifyOrReturn(CheckConstraintMinValue("value", value, 0U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 15U));
            }
            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, 135U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 150U));
            }
            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(CheckValue("currentHue", value, 135U));
            }
            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, 105U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 120U));
            }
            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(CheckValue("currentHue", value, 120U));
            }
            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, 60U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 72U));
            }
            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(CheckValue("currentHue", value, 60U));
            }
            break;
        case 47:
            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, 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(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"), return ContinueOnChipMainThread(CHIP_NO_ERROR));
            return ReadAttribute(kIdentityAlpha, GetEndpoint(1), ColorControl::Id, ColorControl::Attributes::CurrentHue::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 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::ColorMode::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(150)); }

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

    chip::EndpointId GetEndpoint(chip::EndpointId endpoint) { return mEndpoint.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, 7000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9000U));
            }
            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, 9000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11000U));
            }
            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, 11000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12000U));
            }
            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(CheckValue("enhancedCurrentHue", value, 12000U));
            }
            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, 54000U));
            }
            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(CheckValue("enhancedCurrentHue", value, 54000U));
            }
            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, 7000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9000U));
            }
            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, 9000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11000U));
            }
            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, 11000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 12000U));
            }
            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(CheckValue("enhancedCurrentHue", value, 12000U));
            }
            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, 9000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 11000U));
            }
            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, 7000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 9000U));
            }
            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, 6000U));
                VerifyOrReturn(CheckConstraintMaxValue("value", value, 7000U));
            }
            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(CheckValue("enhancedCurrentHue", value, 6000U));
            }
            break;
        case 47:
            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, 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(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.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::ColorMode::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, "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, "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, "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, "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, "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, "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, "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, "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, "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, "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, "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, "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, "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_1_1Suite : public TestCommand
{
public:
    Test_TC_DRLK_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_DRLK_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_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_1_1Suite : public TestCommand
{
public:
    Test_TC_LCFG_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LCFG_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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(350)); }

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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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"), 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_1_1Suite : public TestCommand
{
public:
    Test_TC_DGTHREAD_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) :
        TestCommand("Test_TC_DGTHREAD_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_1_2Suite : public TestCommand
{
public:
    Test_TC_LTIME_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LTIME_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_1_2Suite : public TestCommand
{
public:
    Test_TC_LUNIT_1_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_LUNIT_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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.C.A0000.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.C.A0000"), 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.C.A0000.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.C.A0000"), 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.C.A0000.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.C.A0000"), 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.C.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_1_1Suite : public TestCommand
{
public:
    Test_TC_FLABEL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_FLABEL_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

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

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        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", 0, 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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

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

    CHIP_ERROR DoTestStep(uint16_t testIndex) override
    {
        using namespace chip::app::Clusters;
        switch (testIndex)
        {
        }
        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_1_1Suite : public TestCommand
{
public:
    Test_TC_BIND_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_BIND_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_1_1Suite : public TestCommand
{
public:
    Test_TC_ACL_1_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_1Suite : public TestCommand
{
public:
    Test_TC_ACL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_2Suite : public TestCommand
{
public:
    Test_TC_ACL_2_2Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ACL_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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_2_1Suite : public TestCommand
{
public:
    Test_TC_ULABEL_2_1Suite(CredentialIssuerCommands * credsIssuerConfig) : TestCommand("Test_TC_ULABEL_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_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)
        {
        default:
            LogErrorOnFailure(ContinueOnChipMainThread(CHIP_ERROR_INVALID_ARGUMENT));
        }

        if (shouldContinue)
        {
            ContinueOnChipMainThread(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;
    }
};

#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_BOOL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BOOL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACT_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_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_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_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_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_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_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_RH_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_RH_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_SC_4_2Suite>(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_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_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_3Suite>(credsIssuerConfig),
        make_unique<Test_TC_ULABEL_2_4Suite>(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_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_2_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_2_3Suite>(credsIssuerConfig),
        make_unique<TestSubscribe_OnOffSuite>(credsIssuerConfig),
        make_unique<DL_UsersAndCredentialsSuite>(credsIssuerConfig),
        make_unique<DL_LockUnlockSuite>(credsIssuerConfig),
        make_unique<DL_SchedulesSuite>(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_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_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_G_2_1Suite>(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_OPCREDS_1_2Suite>(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_1_1Suite>(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_1_1Suite>(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_2_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_1Suite>(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_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_DGSW_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGSW_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_DGWIFI_1_1Suite>(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_OCC_3_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_PRS_2_2Suite>(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_1_1Suite>(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_1_1Suite>(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_1_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_1_2Suite>(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_1_2Suite>(credsIssuerConfig),
        make_unique<Test_TC_LUNIT_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_LUNIT_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLABEL_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLABEL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_FLABEL_3_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_BIND_1_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_1_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_1Suite>(credsIssuerConfig),
        make_unique<Test_TC_ACL_2_2Suite>(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_2_1Suite>(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),
#endif // CONFIG_ENABLE_YAML_TESTS
    };

    commands.Register(clusterName, clusterCommands);
}
